SQL选择有序列表中的第一个匹配项

时间:2018-06-06 19:44:30

标签: sql sql-server

使用Microsoft SQL Server Management Studio版本14.0.17213.0

我有一系列按顺序排列的事件。我想选择最高的先例acct_nocomplete_dateevent

我的问题是如果我使用

select 
    account_number, event, max(complete_date) as mx_comp
from 
    mytable
where 
    event in ('event1','event2'....)

然后我获得了所有acct_numbers,列表中的所有事件以及该事件的最大完整日期。但我希望列出的acct_no包含列表中任何项目的最大完成日期以及相关事件。

此外,完全有可能两个事件发生在同一天,所以我不能做

select * 
from mytable mt
join
    (select acct_number, max(complete_date) 
     from mytable) t on mt.acct_number = t.account_number 
                     and mt.complete_date = t.complete_date

因为如果同一天发生了两件事,那么我仍然会得到重复的结果。

我试图用

做类似的事情
    row_number() over (order by account_number) as RowNum

但它不起作用,因为我仍然得到所有事件的匹配,而不仅仅是我的最高优先级事件

它真的归结为需要从有序列表中的项目返回与最高重要性匹配相关联的acct_number,事件和完整日期。

我确信这很容易 - 我似乎无法弄明白,尽管我的谷歌和堆栈搜索我只是无法弄明白

我最近一直认为有可能使用coalesce(mylist)这样的东西,因为我能够按顺序列出我的列表,但我无法弄清楚如何以有意义的方式使用coalesce来解决这个问题。

真正的解决方案是创建一个具有优先数的表或具有最新指标,但我没有无限制的权限来创建我想要的任何表。

有关如何匹配有序列表的任何帮助或想法将不胜感激

1 个答案:

答案 0 :(得分:1)

你似乎想要:

select t.*
from (select t.*,
            row_number() over (partition by account_number order by complete_date desc) as seqnum
      from mytable t
      where event in ('event1', 'event2', ....)
     ) t
where seqnum = 1;