【问题标题】:How can I get a rank query for contiguous dates and various column values如何获取连续日期和各种列值的排名查询
【发布时间】:2021-02-03 12:12:08
【问题描述】:

我得到以下输入:

state        Date
success      01-01-2021
fail         03-01-2021
success      05-01-2021
success      06-01-2021
fail         07-01-2021
fail         09-01-2021

我想获得一个考虑状态和连续日期的排名查询或 row_number 查询,即:

state        Date         rank
success      01-01-2021   1
fail         03-01-2021   2
success      05-01-2021   3
success      06-01-2021   3
fail         07-01-2021   4
fail         09-01-2021   5

我很想听听一些想法,因为在过去的一个小时里我一直在努力让类似的东西发挥作用。显然也欢迎使用不同方法的相同结果!

【问题讨论】:

  • 为什么第 3 行和第 4 行排名相同,而第 5 行和第 6 行排名不同?两对的状态相同,日期不同。
  • 因为日期是连续的,状态是一样的!
  • 你的意思是日期之间有 1 天?我认为你的意思是连续的而不是连续的。
  • 哦,对不起,马上改!你是对的
  • @P.Salmon 我刚学了一个新的英文单词,谢谢 :)

标签: mysql gaps-and-islands


【解决方案1】:

我相信,如果您只使用 LAG() 函数并比较 State 和 Date,您应该能够得到您正在寻找的结果。但是您必须如上所述修改您的日期,因为它们看起来像一个月的第一天,而不是连续的几天。

请考虑:

SELECT State,Date,  SUM(CASE WHEN DATEDIFF(Date,PrevDate) = -1 AND State = PrevState THEN 0 ELSE 1 END) OVER(ORDER BY Date)
FROM
(
    SELECT *,LAG(Date,1,Date) OVER(ORDER BY Date) PrevDate,
             LAG(State,1,State) OVER(ORDER BY Date) PrevState from T
) T2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    相关资源
    最近更新 更多