问题描述
我有一个表,其中包含从日期 a
到日期 b
的时间间隔。间隔以 30 分钟为单位,如下所示:
2021-02-22 00:00:00.000
2021-02-22 00:30:00.000
2021-02-22 01:00:00.000
2021-02-22 01:30:00.000
2021-02-22 02:00:00.000
2021-02-22 02:30:00.000
2021-02-22 03:00:00.000
[...]
2021-03-21 23:30:00.000
我必须每 30 分钟检查一次从我的 MIN(date) = 2021-02-22 00:00:00.000
到我的 MAX(date) = 2021-03-21 23:30:00.000
是否有记录。
每个日历周记录的 COUNT()
是 336
。每天 30 分钟 * 每周 7 天 = (24 * 2) * 7。
我试图检查每个日历周是否有 336 条记录,但如果一条记录丢失而一条记录存在两次,则计数为 336,但结果是错误的。
SELECT *
FROM (
SELECT a,b,DATEPART(iso_week,interval_datetime) AS cw,COUNT(id) AS counts
FROM data_table
GROUP BY DATEPART(iso_week,interval_datetime),a,b
) AS xyz
WHERE counts <> 336;
是否有其他方法可以检查是否有重复记录并检查是否使用了每 30 分钟记录?也许没有“日期”表。
谢谢!
解决方法
WITH CTE(CHECK_TIME) AS
(
SELECT '2021-02-22 00:00:00.000'
UNION ALL
SELECT'2021-02-22 00:30:00.000'
UNION ALL
SELECT'2021-02-22 01:00:00.000'
UNION ALL
SELECT'2021-02-22 01:30:00.000'
UNION ALL
SELECT'2021-02-22 02:00:00.000'
UNION ALL
SELECT'2021-02-22 02:30:00.000'
UNION ALL
SELECT'2021-02-22 03:00:00.000'
UNION ALL
SELECT '2021-02-22 03:18:00.000'--FAIL ROW
UNION ALL
SELECT'2021-02-22 03:00:00.000'--DOUBLED RECORD
)
SELECT C.CHECK_TIME,LAG(CHECK_TIME)OVER(ORDER BY C.CHECK_TIME)LAGG,ABS(DATEDIFF(MI,C.CHECK_TIME,LAG(CHECK_TIME)OVER(ORDER BY C.CHECK_TIME)))AS MINUTES_DIFFERENCE
FROM CTE AS C
您能否检查一下这种方法是否有助于隔离有问题的记录。我将其发布为答案,因为评论太长了
,您可以使用 LEAD
获取下一个值,然后进行过滤以返回所有差距过大的值
SELECT *
FROM (
SELECT a,b,interval_datetime,LEAD(interval_datetime) OVER (ORDER BY interval_datetime) AS nextInterval
FROM data_table
) AS t
WHERE nextInterval IS NULL OR DATEDIFF(second,nextInterval) > 1800;