Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找具有相同值的连续天数_Sql - Fatal编程技术网

Sql 查找具有相同值的连续天数

Sql 查找具有相同值的连续天数,sql,Sql,我的数据是这种格式的 CALENDAR CLIENTID TOTAL 20170801 1700 2 20170801 1800 20170801 1900 2 20170801 1990 20170801 2000 0 20170801 2090 0 20170802 2090 0 20170803 2090 0

我的数据是这种格式的

CALENDAR    CLIENTID    TOTAL
20170801    1700          2
20170801    1800    
20170801    1900          2
20170801    1990    
20170801    2000          0
20170801    2090          0
20170802    2090          0
20170803    2090          0
当某个客户连续三次总计为零时,我正在尝试获取最小的
日历日。因此,在上面的示例中,我的输出将是
20170801
,因为客户
2090
20170801
20170802
20170803
天上的
总数为零。到目前为止,我有以下查询,但是
a
b
计数不准确

WITH cte AS (
    SELECT *,COUNT(1) OVER(PARTITION BY clientid) b  FROM
    (
        SELECT tt.*
           ,(SELECT COUNT(CALENDAR) FROM STATS 
                WHERE total = 0 
            ) AS a
        FROM STATS tt
        WHERE total = 0
    ) t1
)
SELECT * FROM cte WHERE b >= 3
使用
lead()
。以下查询按日期获取所有此类日期:

select s.*
from (select s.*,
             lead(total) over (partition by clientid order by calendar) as total_1,
             lead(total, 2) over (partition by clientid order by calendar) as total_2
      from stats s
     ) s
where total = 0 and total_1 = 0 and total_2 = 0
order by date;
您可以添加
fetch first 1 row only
,或者为您的数据库添加等效项以仅获取一行。

方法如下

WITH cte AS (
  Select * From dbo.Consequtive Where TOTAL = 0
  )

SELECT r1.*, r2.*, r3.*
  FROM cte as r1
Left Join cte as r2
  On r1.CLIENTID = r2.CLIENTID and DATEADD(day, 1, r1.CALENDAR)  = r2.CALENDAR
Left Join cte as r3
  On r1.CLIENTID = r3.CLIENTID and DATEADD(day, 2, r1.CALENDAR)= r3.CALENDAR

Where r1.TOTAL = 0 and r2.TOTAL = 0 and r3.TOTAL = 0  
导致

CALENDAR    CLIENTID    TOTAL   CALENDAR    CLIENTID    TOTAL   CALENDAR    CLIENTID    TOTAL
2017-08-01  2090        0   2017-08-02  2090        0   2017-08-03  2090        0

你能解释一下我们如何知道哪些记录是连续的吗?这三个字段似乎都不是唯一的。@GMB对于clientid
2090
来说,
total
是唯一的(零),这也是唯一的。我正在寻找
20170801
作为clientid
2090
的输出,因为连续3天(
20170801
20170802
20170803
)的总数为零。啊,好的,对不起,这已经足够清楚了。我认为Gordon的答案是最适合您的用例的!