我有一个看起来像这样的数据库:
FromDate ToDate ProfileUID
2017-02-10 07:00:00 2017-02-10 15:30:00 TB_D
2017-02-09 23:00:00 2017-02-10 07:00:00 ZK_D
2017-02-09 17:30:00 2017-02-09 23:00:00 DL_D
2017-02-09 07:00:00 2017-02-09 17:30:00 AM_D
2017-02-08 23:00:00 2017-02-09 07:00:00 CK_D
2017-02-08 17:30:00 2017-02-08 23:00:00 DJ_N
此DB通常是手动修改的,用户可以完成一些错误。
我正在尝试进行SQL查询以检查时间表是否正常,这意味着我想知道直到我的记录为止(这里我们只填写了接下来的两天)以及是否没有“黑色”计划中的“漏洞”,意味着没有填充profileUID的期间。
到目前为止我所拥有的:
SELECT *,LAG (ToDate) OVER (PARTITION BY FromDate ORDER BY FromDate)
FROM `dashboardcalendar`
WHERE FromDate>= NOW()
ORDER BY `dashboardcalendar`.`FromDate` ASC
答案 0 :(得分:0)
编辑:鉴于你不能在你的MariaDB版本上使用窗口函数,试试这个:
SELECT FromDate, ToDate, ProfileUID, next_FromDate, last_ToDate,
CASE WHEN next_record_uid is null then 'Warning - Gap after' end warn1,
CASE WHEN prev_record_uid is null then 'Warning - Gap before' end warn2
FROM (
SELECT t1.FromDate, t1.ToDate, t1.ProfileUID,
t2.ProfileUID next_record_uid,
t3.ProfileUID prev_record_uid
FROM table t1
LEFT JOIN table t2
ON t1.ToDate = t2.FromDate
LEFT JOIN table t3
ON t1.FromDate = t3.ToDate
)
这并不考虑时间上的重叠 - 如果两个时间段重叠,它会给出误报警。
原始答案:
我使用LEAD和LAG,然后用另一个select进行比较:
SELECT FromDate, ToDate, ProfileUID, next_FromDate, last_ToDate,
CASE WHEN ToDate < next_FromDate then 'Warning - Gap after' end warn1,
CASE WHEN FromDate > last_ToDate then 'Warning - Gap before' end warn2
FROM (
SELECT FromDate, ToDate, ProfileUID,
LEAD(FromDate,1) OVER (ORDER BY FromDate) next_FromDate,
LAG(FromDate,1) OVER (ORDER BY FromDate) last_ToDate
FROM table
)
你不需要分区,听起来就像你的描述一样,每条记录都涵盖了一段不同的时间,所以没有什么可以分组。