【问题标题】:Get the lowest date out of a set based on priority ID根据优先级 ID 从一组中获取最低日期
【发布时间】:2021-12-12 04:16:23
【问题描述】:

我有以下优先级列表,其中 Source4 优先于 3、3 优先于 2、2 优先于 1,依此类推。

SourceID SourceDescription
1 Source1
2 Source2
3 Source3
4 Source4

我还有下表包含数据(但是该表将包含多个不同的 EventID)

EventID CommencingTime SourceID
12345 2021-10-24 11:27:34 1
12346 2021-10-24 11:27:34 1
12347 2021-10-24 11:27:34 1
12345 2021-10-24 12:58:55 3
12346 2021-10-24 12:58:55 3
12347 2021-10-24 12:58:55 3
12345 2021-10-24 10:58:00 2
12346 2021-10-24 10:58:00 2
12347 2021-10-24 10:58:00 2

如何根据优先级列表从上面获取最低日期。

在这种情况下,正确的结果集应该是:

EventID CommencingTime SourceID
12345 2021-10-24 12:58:55 3
12346 2021-10-24 12:58:55 3
12347 2021-10-24 12:58:55 3

我尝试过MIN OVER PARTITION BY ORDER BY SourceID DESC,但这只是不断返回 2021-10-24 10:58:00 并忽略优先级 SourceID

【问题讨论】:

  • 我已尝试按 SourceID DESC 的顺序执行 MIN OVER PARTITION,但这只是不断返回 2021-10-24 10:58:00 并忽略优先级 SourceID
  • edit您尝试回答您的问题。顺便说一句,如果您将示例数据添加为 DDL+DML,您可以更轻松地为我们提供帮助。
  • 1234612347 也具有相同的日期和优先级源ID 时,EventID 12345 是唯一返回的行是否有原因?
  • @ggordon,对不起错误。现在更正了。只要它尊重优先级列表顺序,它实际上可以返回所有事件。所以在这种情况下,它会返回 12345, 12346, 12347 但都是 2021-10-24 12:58:55
  • @thatsweetguy 感谢您的澄清。我已经更新了答案以反映这一点

标签: sql sql-server tsql min


【解决方案1】:

您可以使用 rank 根据您共享的示例实现此目的

select 
    EventID,CommencingTime,SourceID
from (
    select
        *,
        rank() over (order by SourceID DESC,CommencingTime) as rn
    from
       mytable
) t
where rn=1

View working demo here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2021-12-30
    • 2019-12-01
    • 1970-01-01
    • 2011-03-07
    • 2017-09-28
    • 2021-12-15
    相关资源
    最近更新 更多