如何编写SQL查询提取最新版本下status全为OK或Waiting的记录
测试表结构与测试数据
CREATE TABLE ssssql ( id_no int(3) , pid varchar(3) , version int(1) , status varchar(7) ); INSERT INTO ssssql (id_no, pid, version, status) VALUES (123, 'P08', 1, 'VOID'), (124, 'P08', 1, 'VOID'), (125, 'P08', 2, 'Waiting'), (126, 'P08', 2, 'Waiting'), (127, 'P08', 2, 'VOID'), (128, 'P08', 2, 'OK'), (129, 'P08', 2, 'OK'), (130, 'P08', 2, 'OK'), (131, 'P08', 2, 'Waiting'), (132, 'P08', 2, 'OK'), (133, 'P08', 1, 'VOID'), (134, 'P08', 1, 'VOID'), (135, 'P08', 2, 'Waiting'), (136, 'P08', 3, 'OK'), (137, 'P08', 3, 'OK'), (138, 'P08', 3, 'OK');
需求说明
查询每个pid对应的最新版本记录,要求该版本下所有记录的status字段值全部为OK或者全部为Waiting,满足条件则返回该版本的全部记录,否则不输出该版本的任何结果。
示例数据中版本2的status包含VOID、OK、Waiting三种取值,不符合要求不返回;版本3所有记录status均为OK,符合要求,返回结果如下:
(136, 'P08', 3, 'OK') (137, 'P08', 3, 'OK') (138, 'P08', 3, 'OK')
实现SQL语句
SELECT s.* FROM ssssql s INNER JOIN ( -- 查找每个pid符合要求的最新版本 SELECT pid, version FROM ssssql GROUP BY pid, version HAVING COUNT(DISTINCT status) = 1 -- 该版本所有记录status只有同一种取值 AND MAX(status) IN ('OK', 'Waiting') -- 取值仅允许为OK或Waiting AND (pid, version) IN ( -- 先取每个pid的最高版本号 SELECT pid, MAX(version) AS max_version FROM ssssql GROUP BY pid ) ) valid_version ON s.pid = valid_version.pid AND s.version = valid_version.version;
内容的提问来源于stack exchange,提问作者Naveed Ahmad
相关产品推荐
相关产品推荐

