SQL 在保持时间排序的同时排名

SQL Rank while keeping time sorted

鉴于此数据

Type    Time    Outcome Wanted Result
1   8:00    1   1
1   9:00    1   1
1   10:00   1   1
0   11:00   2   2
0   12:00   2   2
0   13:00   2   2
1   14:00   1   3
1   15:00   1   3
0   16:00   2   4
1   17:00   1   5
0   18:00   2   6
1   19:00   1   7

第三列是我使用以下 sql 查询得到的当前结果:

SELECT Type, Time, DENSE_RANK() OVER (ORDER BY Type) as Outcome
FROM Tbl

我需要 dense_rank 来保持时间排序,同时按类型对数据进行排序。第 4 列是想要的结果。

我正在使用 SQL Server 2008

这很棘手。您可以使用不同的行号来执行此操作。这种方法一开始有点难以理解,所以我建议你 运行 子查询来理解发生了什么。当您查看结果时,您会很快 "get it":

select t.*,
       dense_rank() over (order by mintime) as desired_column
from (select t.*,
             min(time) over (partition by id, seqnum_t - seqnum_it) as mintime
      from (select t.*, 
                   row_number() over (order by time) as seqnum_t,
                   row_number() over (partition by id order by time) as seqnum_it
            from tbl t
           ) t
     ) t;