如何在查询中为MAX函数设置自定义“排名”顺序?

时间:2012-09-17 13:45:02

标签: sql sql-server

我有一个包含重复项的数据集,其中包含'status'整数字段。我想知道是否有某种方法可以将MAX()聚合函数设置为'设置'某些值为较低优先级。

我最终要对此数据集运行查询以对重复项进行分组,并选择“最大”状态值不是“6”的那个,但如果是值,则返回6此记录没有重复。

使用MAX是最好的解决方法还是有更好的方法?

3 个答案:

答案 0 :(得分:2)

select coalesce(max(case when id = 6 then null else id end), max(id))
from (select 6 id union all select 2) a

我同意Dems的改进建议,谢谢@Dems

select coalesce(max(nullif(id, 6)), max(id))
from (select 6 id union all select 2) a

如果'id'永远不为null,则max(id)可以替换为6

答案 1 :(得分:0)

declare @T table
(
  Grp int,
  Val int
)

insert into @T values
(2, 1),
(2, 2),
(2, 6),
(6, 6),
(7, 2),
(7, 6),
(7, 7)

select Val
from 
  (
    select Val,
           row_number() over(partition by Grp 
                             order by case when Val = 6 
                                        then 1 
                                        else 0 
                                      end, Val desc) as rn
    from @T 
  ) as T
where T.rn = 1

结果:

Val
-----------
2
6
7

答案 2 :(得分:0)

如果您使用的是SQL Server,则可能需要浏览排名函数。

http://msdn.microsoft.com/en-us/library/ms176102.aspx

Find Duplicates using Rank Over Partition