SQL 按连续日期块排名
SQL Ranking by consecutive date blocks
我正在尝试对连续日期块的数量进行排名,但最好的方法是什么?下面的示例显示前 3 个块是连续的,然后 4 个块之间有一个月,因此计数将重新开始。
我要订购的数据:
StartDate | EndDate |Rank
----------+-----------+----
01/01/2016| 01/02/2016| 1
01/02/2016| 01/03/2016| 2
01/03/2016| 01/04/2016| 3
01/05/2016| 01/06/2016| 1
您可以通过确定分组的开始位置、计算累加和来确定组,然后确定行号来完成此操作:
select t.*,
row_number() over (partition by grp order by startdate) as rank
from (select t.*,
sum(case when tprev.startdate is null then 1 else 0 end) over (order by startdate) as grp
from t left join
t tprev
on t.startdate = tprev.enddate
) t;
这个特定的 SQL 适用于您提供的数据。它不会处理重叠超过一天的数据,也不会处理同一天开始的多个记录。这些都可以处理。如果您的数据更像那样,请提出另一个 问题,其中包含适当的数据。
我正在尝试对连续日期块的数量进行排名,但最好的方法是什么?下面的示例显示前 3 个块是连续的,然后 4 个块之间有一个月,因此计数将重新开始。
我要订购的数据:
StartDate | EndDate |Rank
----------+-----------+----
01/01/2016| 01/02/2016| 1
01/02/2016| 01/03/2016| 2
01/03/2016| 01/04/2016| 3
01/05/2016| 01/06/2016| 1
您可以通过确定分组的开始位置、计算累加和来确定组,然后确定行号来完成此操作:
select t.*,
row_number() over (partition by grp order by startdate) as rank
from (select t.*,
sum(case when tprev.startdate is null then 1 else 0 end) over (order by startdate) as grp
from t left join
t tprev
on t.startdate = tprev.enddate
) t;
这个特定的 SQL 适用于您提供的数据。它不会处理重叠超过一天的数据,也不会处理同一天开始的多个记录。这些都可以处理。如果您的数据更像那样,请提出另一个 问题,其中包含适当的数据。