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对于clientid2090
来说,total
是唯一的(零),这也是唯一的。我正在寻找20170801
作为clientid2090
的输出,因为连续3天(20170801
,20170802
和20170803
)的总数为零。啊,好的,对不起,这已经足够清楚了。我认为Gordon的答案是最适合您的用例的!