省略重复行,然后根据特定条件选择幸存的行

时间:2013-10-29 17:27:47

标签: sql sql-server tsql

所以我的表格中有以下数据

id   id2  flag
 1    11  0 <- this row should not be part of the result
 1    12  1 <- this row should survive the distinct operation
 2    13  0
 3    14  0

我希望我的结果是

id   id2  flag
 1    12  1
 2    13  0
 3    14  0

我如何构建这样的查询?

由于

EDIT1:抱歉,使用两列虚假数据无法正确反映我所面临的问题。我添加了另一列,这使问题复杂化。正如你所看到的,我无法对id2进行分组,因为它们都是唯一的。但是结果中应该省略id2 = 11的行。

EDIT2:将问题更改为使用'省略'而不是'删除'

EDIT3:

select id, id2, max(flag)
from table
group by id, id2

此查询返回所有4行,因为按ID2分组包括所有4行。

2 个答案:

答案 0 :(得分:5)

如果要对数据应用其他条件,通常使用GROUP BY代替DISTINCT。例如,如果您希望保留flag 1(如果存在),或保持为零,则可以执行此操作:

SELECT id, MAX(flag) as flag -- Since 1 > 0, MAX() works fine
FROM myTable
GROUP BY id                  -- This keeps only distinct ids

编辑(响应编辑#2和3)

另一个解决方案是在子查询中使用NOT EXISTS,如下所示:

SELECT id, id2, flag
FROM myTable o
WHERE NOT EXISTS (
    SELECT * FROM myTable i WHERE o.id=i.id AND i.flag > o.flag
)

答案 1 :(得分:1)

;with CTE as
(
select 
    row_number() over (partition by id order by flag desc) as rn, 
    id, 
    id2, 
    flag
    from myTable
)

SELECT * from CTE where rn = 1