SQL排名同时保持时间排序

时间:2016-07-19 03:45:45

标签: sql sql-server-2008 dense-rank

鉴于此数据

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来保持时间排序,同时按类型对数据进行排名。第四列是想要的结果。

我正在使用SQL Server 2008

1 个答案:

答案 0 :(得分:1)

这很棘手。您可以使用行号的不同来执行此操作。这个方法起初有点难以理解,因此我建议您运行子查询以了解发生的情况。当你看到结果时,你会很快“得到它”:

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;