查找具有许多相似值和一个不同值的行

时间:2013-08-27 16:06:21

标签: sql sql-server sql-server-2008

我正在尝试通过违反唯一键索引来隔离问题。我很确定原因是由于列中具有相同值的列在3列中没有相同的值(当它们应该时)。举个例子......

Key   Column1   Column2   Column3   Column4
1       A          B         C         D
2       A          B         C         D
3       A          B         C         D
4       A          B         C         Z

我基本上想要选择第4列,或者某种方式让我识别第4列。我知道这是使用聚合函数的问题,但我对它们并不是很熟悉。任何人都可以协助选择Key,Column4来获得具有不同列4值和相同列1-3值的行吗?

2 个答案:

答案 0 :(得分:1)

这就是你想要的:

select column1, column2, column3
from t
group by column1, column2, column3
having min(column4) <> max(column4)

获得前三列的正确值后,您可以重新加入以获取特定行。

或者,你可以使用这样的窗口函数:

select t.*
from (select t.*, min(column4) over (partition by column1, column2 column3) as min4,
             max(column4) over (partition by column1, column2 column3) as max4
      from t
     ) t
where min4 <> max4;

如果NULL是您想要计算的有效“其他”值,则需要额外的逻辑。

答案 1 :(得分:1)

如果您想获取所有列,那么(如果窗口count支持distinct可能会更简单,但事实并非如此):

with cte1 as (
    select distinct * from Table1
), cte2 as (
    select
        *,
        count(column4) over(partition by column1, column2, column3) as cnt
    from cte1
)
select * from cte2 where cnt > 1;

如果您只想选择密钥:

select
    column1, column2, column3
from Table1
group by column1, column2, column3
having count(distinct column4) > 1

sql fiddle demo