说我有下表:
+------------+-------+
| Date | Count |
+------------+-------+
| 11/25/2017 | 1 |
| 11/21/2017 | 1 |
| 11/20/2017 | 1 |
| 11/18/2017 | 1 |
| 11/10/2017 | 1 |
| 11/2/2017 | 0 |
| 10/27/2017 | 0 |
| 10/26/2017 | 1 |
| 10/21/2017 | 1 |
| 10/21/2017 | 1 |
| 10/17/2017 | 1 |
| 10/9/2017 | 0 |
| 10/2/2017 | 0 |
| 9/22/2017 | 0 |
| 9/14/2017 | 1 |
| 9/10/2017 | 1 |
| 9/10/2017 | 1 |
| 9/10/2017 | 0 |
| 9/4/2017 | 1 |
| 8/27/2017 | 1 |
| 8/19/2017 | 0 |
| 8/14/2017 | 0 |
+------------+-------+
Run Code Online (Sandbox Code Playgroud)
我需要SQL查询来输出以下内容:
+------------+-------+------+
| Date | Count | Flag |
+------------+-------+------+
| 11/25/2017 | 1 | 1 |
| 11/21/2017 | 1 | 1 |
| 11/20/2017 | 1 | 1 |
| 11/18/2017 | 1 | 1 |
| 11/10/2017 | 1 | 1 |
| 11/2/2017 | 0 | 0 |
| 10/27/2017 | 0 | 0 |
| 10/26/2017 | 1 | 2 |
| 10/21/2017 | 1 | 2 |
| 10/21/2017 | 1 | 2 |
| 10/17/2017 | 1 | 2 |
| 10/9/2017 | 0 | 0 |
| 10/2/2017 | 0 | 0 |
| 9/22/2017 | 0 | 0 |
| 9/14/2017 | 1 | 2 |
| 9/10/2017 | 1 | 2 |
| 9/10/2017 | 1 | 2 |
| 9/10/2017 | 0 | 0 |
| 9/4/2017 | 1 | 3 |
| 8/27/2017 | 1 | 3 |
| 8/19/2017 | 0 | 0 |
| 8/14/2017 | 0 | 0 |
+------------+-------+------+
Run Code Online (Sandbox Code Playgroud)
需要填充Flag列.它的值可以是0,1,2,以下是条件:
1 - 计数> 0,需要从最近的日期开始,直到Count = 0并且最小上限为3连续Count> 0
2 - 计数> 0,不是从最近日期开始,但检查3连续计数> 0的最小上限,
直到计数= 03 - 计数= 1,连续系列没有上限
0 - 计数为0时
请帮忙
这是一个差距和岛屿问题
select date, count,
case when count > 0 then
case when count(*) over (partition by grn, count) >= 3 then
case when max(date) over (partition by grn, count) = max_date then 1
else 2
end
else 3
end
else 0
end flag
from
(
select date, count,
row_number() over (order by date, count)-
row_number() over (partition by count order by date, count) grn,
(select max(date) from data) max_date
from data
) t
order by date desc, count desc
Run Code Online (Sandbox Code Playgroud)
该解决方案基于1的连续序列的识别,其通过创建grp列来完成.一旦你隔离了连续的序列,剩下的就很简单了CASE.
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |