我想输出每个Case_Number的列表,其中CodeID的UniqueID值高于其Code2对应的UniqueID值

时间:2017-11-14 19:34:27

标签: sql sql-server

我有一张看起来像这样的表:

    Case_Number  |  Code  |  UniqueID
        a             1       1372
        a             2       1352
        a             3       1325
        b             1       1642
        b             2       1651
        b             3       1623
        c             1       1743
        c             2       1739
        c             3       1720
       ...           ...        ...

从这个数据库中我想输出每个Case_Number的列表,其中Code 1的UniqueID值高于Code 2的UniqueID值(但忽略Code 2的UniqueID值,或者可能在的任何其他Code x值)桌子)。这意味着如果Code 2的UniqueID值高于Code 1,上例中的Case_Number b就是这种情况,它不应该出现在列表中。

因此,查询上表会导致:

    Case_Number  |  Code  |  UniqueID
        a             1       1372
        c             1       1743

2 个答案:

答案 0 :(得分:0)

嗯。嗯。 。 。你似乎想要:

select t.*
from t
where t.code = 1 and
      t.uniqueid > (select max(t2.uniqueid)
                    from t t2
                    where t2.case_number = t.case_number and t2.code = 2
                   );

子查询中的max()只是为了处理存在多个匹配值的情况。

答案 1 :(得分:0)

下面的查询为您提供了预期的结果

CREATE TABLE CaseTab
(Case_Number VARCHAR(10),
 Code        INT,  
 UniqueID    INT);

INSERT INTO CaseTab VALUES ('a',             1,       1372);
INSERT INTO CaseTab VALUES ('a',             2,       1352);
INSERT INTO CaseTab VALUES ('a',             3,       1325);
INSERT INTO CaseTab VALUES ('b',             1,       1642);
INSERT INTO CaseTab VALUES ('b',             2,       1651);
INSERT INTO CaseTab VALUES ('b',             3,       1623);
INSERT INTO CaseTab VALUES ('c',             1,       1743);
INSERT INTO CaseTab VALUES ('c',             2,       1739);
INSERT INTO CaseTab VALUES ('c',             3,       1720);

WITH v_code_gt_1 AS
(SELECT Case_Number, MAX(UniqueID) AS UniqueID
   FROM CaseTab
  WHERE Code > 1
  GROUP BY Case_Number)
SELECT c1.Case_Number, c1.UniqueID
  FROM CaseTab c1 JOIN
       v_code_gt_1 c2
       ON (c1.Case_Number = c2.Case_Number)
 WHERE c1.UniqueID > c2.UniqueID
   AND c1.Code = 1;

基本上,查询获取代码大于1的所有情况的最大UniqueID,并与代码1的唯一ID进行比较。

您尚未说明是否存在代码= 1但没有其他代码的情况。如果是这样,请使用LEFT JOIN,如下所示。

WITH v_code_gt_1 AS
(SELECT Case_Number, MAX(UniqueID) AS UniqueID
   FROM CaseTab
  WHERE Code > 1
  GROUP BY Case_Number)
SELECT c1.Case_Number, c1.UniqueID
  FROM CaseTab c1 LEFT JOIN
       v_code_gt_1 c2
       ON (c1.Case_Number = c2.Case_Number)
 WHERE c1.UniqueID > ISNULL(c2.UniqueID, 0)
   AND c1.Code = 1;