我有一张如下表格:
id | type | duedate
-------------------------
1 | original | 01/01/2017
1 | revised | 02/01/2017
2 | original | 03/01/2017
3 | original | 10/01/2017
3 | revised | 09/01/2017
每个id可能有一行或两行。如果有两个具有相同id的行,则会有一个type ='original',另一个type ='modified'。如果id有一行,则type将始终为“original”。
我想要的结果是type ='modified'的所有行,但如果某个id只有一行(因此type ='original'),那么我也想要包含该行。因此,上述所需的输出将是:
id | type | duedate
1 | revised | 02/01/2017
2 | original | 03/01/2017
3 | revised | 09/01/2017
我不知道如何构造WHERE子句,有条件地检查给定id是否有1行或2行,也不知道如何使用GROUP BY,因为修订日期可能大于或小于原始日期所以使用聚合函数MAX或MIN不起作用。我想过以某种方式使用CASE,但也不知道如何构造一个条件,在两个不同的数据行之间选择(如果有两行)并显示其中一个而不是另一个。
任何建议的方法都将受到赞赏。
谢谢!
答案 0 :(得分:4)
您可以使用行号。
WITH T AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Type DESC) AS RN
FROM YourTable
)
SELECT *
FROM T
WHERE RN = 1
答案 1 :(得分:1)
这样的事情是否足够?
SELECT *
FROM mytable m1
WHERE type='revised'
or 1=(SELECT COUNT(*) FROM mytable m2 WHERE m2.id=m1.id)
答案 2 :(得分:0)
您可以使用子查询来获取MAX([type])
。在这种情况下,它适用于[类型],因为按字母顺序我们首先需要修改,然后原始和" r"来自" o"在字母表中。然后我们可以使用匹配的条件将INNER JOIN返回到同一个表中。
SELECT T2.*
FROM (
SELECT id, MAX([type]) AS [MAXtype]
FROM myTABLE
GROUP BY id
) AS dT INNER JOIN myTable T2 ON dT.id = T2.id AND dT.[MAXtype] = T2.[type]
ORDER BY T2.[id]
提供输出:
id type duedate
1 revised 2017-02-01
2 original 2017-03-01
3 revised 2017-09-01
这是sqlfiddle:http://sqlfiddle.com/#!6/14121f/6/0