TSQL条件何处或分组?

时间:2017-11-17 21:14:09

标签: sql-server tsql group-by case

我有一张如下表格:

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,但也不知道如何构造一个条件,在两个不同的数据行之间选择(如果有两行)并显示其中一个而不是另一个。

任何建议的方法都将受到赞赏。

谢谢!

3 个答案:

答案 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