为组选择不同的行

时间:2014-05-28 17:02:07

标签: sql-server oracle

任何人都可以告诉我如何为列C1中的每个不同值选择C3列中具有最小值的记录,但如果C3中的值相同,则列c2中值为“x”的记录应该被选中。例如,对于下面插入的值,我想看第一行和第三行。非常感谢。

CREATE TABLE Test.tst (
    C1  nvarchar(3) NOT Null,
    C2  nvarchar(3) NOT Null,
    C3  int not null)

Insert into test.tst
select 'A', 'x', 2 union
select 'A', 'y', 2 union
select 'B', 'x', 1 union
select 'B', 'y', 2

2 个答案:

答案 0 :(得分:3)

您的问题的一般答案是row_number()使用聪明的order by

select c1, c2, c3
from (select t.*,
             row_number() over (partition by c1
                                order by c3 asc, (case when c2 = 'x' then 1 else 0 end) desc
                               ) as seqnum
      from tst t
     ) t
where seqnum = 1;

编辑:

Here是一个有效的SQL小提琴。

答案 1 :(得分:0)

这样的事情应该有效

select C1, min(C2) as C2, min(C3) as C3 from test group by C1

编辑:已添加SQL Fiddle