2017-02-08 7 views
0

У меня есть БД, которая выглядит следующим образом:SQL: Как проверить, если мой график нормально

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 

Этой БД часто модифицированный вручную и некоторые ошибки могут быть сделана пользователем.

Я пытаюсь выполнить запрос SQL, чтобы проверить, нормально ли это расписание, что означает, что я хотел бы знать до тех пор, пока мои записи не будут (здесь мы заполнили только два дня), а если нет, черные дыры "в графике, то есть есть период без заполнения профиля.

То, что я до сих пор:

SELECT *,LAG (ToDate) OVER (PARTITION BY FromDate ORDER BY FromDate) 
FROM `dashboardcalendar` 
WHERE FromDate>= NOW() 
ORDER BY `dashboardcalendar`.`FromDate` ASC 
+0

Моя БД - 10.1.14-MariaDB – timmalos

+1

Что вы подразумеваете под «Что я до сих пор»? В MariaDB 10.1.14 нет оконных функций, они были добавлены в 10.2. – elenst

ответ

0

EDIT: Учитывая, что вы не можете использовать оконные функции в версии 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 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 
) 

Вам не нужно разделить, это звучит как из ваше описание, что каждая запись охватывает определенный период времени, поэтому нет ничего, чтобы сгруппироваться.

+1

Вы не можете сделать это 10.1.14. Функции Window были введены в MariaDB 10.2. – elenst

+0

Так что даже исходный код OP не будет работать, учитывая информацию, которую он добавил после того, как я отправил этот ответ, круто. – htf