0

所以我的表中有以下数据

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:将问题更改为使用“省略”而不是“删除”

编辑3:

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

此查询返回所有 4 行,因为 group by id2 包括所有 4 行。

4

2 回答 2

5

当您想对数据应用附加条件时,通常使用GROUP BY代替DISTINCTflag例如,如果你想保持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
)
于 2013-10-29T17:30:24.423 回答
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
于 2013-10-29T17:49:36.287 回答