标记行中的连续系列

Vik*_*ram 0 sql sql-server

说我有下表:

+------------+-------+
|    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的最小上限,
直到计数= 0

3 - 计数= 1,连续系列没有上限

0 - 计数为0时

请帮忙

Rad*_*ača 5

这是一个差距和岛屿问题

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)

dbfiddle

该解决方案基于1的连续序列的识别,其通过创建grp列来完成.一旦你隔离了连续的序列,剩下的就很简单了CASE.