0

我手头有一个特殊的问题。我需要按以下方式排名:

  1. 每个 ID 都会获得一个新的排名。
  2. 排名 #1 分配给日期最低的 ID。但是,该特定 ID 的后续日期可能更高,但它们将获得其他 ID 的增量排名。(例如 ADF32 系列将被视为排名第一,因为它的日期最低,虽然它以 09-11 月结束,而 RT659 以 13-8 月开始,它将随后排名)
  3. 对于特定的 ID,如果天数是连续的,则排名相同,否则它们加 1。
  4. 对于特定 ID,排名以日期 ASC 给出。

样本

如何制定查询?

4

3 回答 3

0

考虑这个问题的一种方法是“何时将等级加 1”。好吧,当同一行上的前一个值id_col相差超过一天时,就会发生这种情况。或者当该行是 id 的最早日期时。

这将问题转化为累积和:

select t.*,
       sum(case when prev_dt_col = dt_col - 1 then 0 else 1
           end) over 
            (order by min_dt_col, id_col, dt_col) as ranking
from (select t.*,
             lag(dt_col) over (partition by id_col order by dt_col) as prev_dt_col,
             min(dt_col) over (partition by id_col) as min_dt_col
      from t
     ) t;
于 2021-05-21T22:00:53.753 回答
0

在领先/滞后上尝试 datediff,然后执行分区排名

select t.ID_COL,t.dt_col, 
rank() over(partition by t.ID_COL, t.date_diff order by t.dt_col desc) as rankk 
from ( SELECT ID_COL,dt_col, 
DATEDIFF(day, Lag(dt_col, 1) OVER(ORDER BY dt_col),dt_col) as date_diff FROM table1 ) t
于 2021-05-21T19:43:52.263 回答
0

你需要两个步骤:

select
   id_col
  ,dt_col
  ,dense_rank()
   over (order by min_dt, id_col, dt_col - rnk) as part_col  
from
 (
    select
       id_col
      ,dt_col
      ,min(dt_col)
       over (partition by id_col) as min_dt
      ,rank()
       over (partition by id_col
             order by dt_col) as rnk
    from tab
 ) as dt

dt_col - rnk计算连续日期的相同结果 -> 相同排名

于 2021-05-21T20:25:48.870 回答