Я уже задавал этот вопрос раньше, к сожалению, мне не совсем понятны детали моего вопроса, поэтому я упросту свой предыдущий вопрос:
Проверьте, существует ли существующая запись на за день до
Как мы можем сделать это, используя LAG()
? У меня проблема с обработкой этого из-за значения NULL
. По сути, я хочу, чтобы в столбцах prevrecordin и prevrecordout отображались журналы за день до или расписание до даты, основанной на recordin и recordout .
Это желаемый результат.
+-------------+--------------+------------+-------------+--------------------+--------------------+--------------------+--------------------+
| badgenumber | scheduledate | schedulein | scheduleout | recordin | recordout | prevrecordin | prevrecordout |
+-------------+--------------+------------+-------------+--------------------+--------------------+--------------------+--------------------+
| 10 | 2019-12-21 | 6:00:00 AM | 2:00:00 PM | 2019-12-21 5:18 am | 2019-12-21 2:12 pm | NULL | NULL |
| 10 | 2019-12-23 | 8:00:00 AM | 5:00:00 PM | 2019-12-23 7:35 am | 2019-12-23 5:03 pm | 2019-12-21 5:18 am | 2019-12-21 2:12 pm |
| 10 | 2019-12-24 | 8:00:00 AM | 5:00:00 PM | NULL | NULL | 2019-12-23 7:35 am | 2019-12-23 5:03 pm |
| 10 | 2019-12-25 | 8:00:00 AM | 5:00:00 PM | NULL | NULL | NULL | NULL |
| 10 | 2019-12-26 | 8:00:00 AM | 5:00:00 PM | 2019-12-26 7:48 am | 2019-12-26 5:05 pm | NULL | NULL |
| 10 | 2019-12-27 | 8:00:00 AM | 5:00:00 PM | 2019-12-27 7:41 am | 2019-12-27 5:02 pm | 2019-12-26 7:48 am | 2019-12-26 5:05 pm |
| 10 | 2019-12-28 | 8:00:00 AM | 5:00:00 PM | 2019-12-28 7:35 am | 2019-12-28 5:07 pm | 2019-12-27 7:41 am | 2019-12-27 5:02 pm |
| 10 | 2019-12-30 | 8:00:00 AM | 5:00:00 PM | NULL | NULL | 2019-12-28 7:35 am | 2019-12-28 5:07 pm |
| 10 | 2019-12-31 | 8:00:00 AM | 5:00:00 PM | NULL | NULL | NULL | NULL |
| 10 | 2020-01-01 | 8:00:00 AM | 5:00:00 PM | NULL | NULL | NULL | NULL |
| 10 | 2020-01-02 | 8:00:00 AM | 5:00:00 PM | 2020-01-02 7:41 am | 2020-01-02 5:16 pm | NULL | NULL |
| 10 | 2020-01-03 | 8:00:00 AM | 5:00:00 PM | 2020-01-03 7:50 am | 2020-01-03 5:05 pm | 2020-01-02 7:41 am | 2020-01-02 5:16 pm |
| 10 | 2020-01-04 | 8:00:00 AM | 5:00:00 PM | 2020-01-04 7:41 am | 2020-01-04 5:04 pm | 2020-01-03 7:50 am | 2020-01-03 5:05 pm |
+-------------+--------------+------------+-------------+--------------------+--------------------+--------------------+--------------------+
Это результат, который я получил.
SQL Fiddle
http://sqlfiddle.com/#! 18 / ef8d9 / 1
CREATE TABLE Table1
([badgenumber] int, [scheduledate] varchar(10), [schedulein] varchar(10), [scheduleout] varchar(10), [recordin] DATETIME, [recordout] DATETIME)
;
INSERT INTO Table1
([badgenumber], [scheduledate], [schedulein], [scheduleout], [recordin], [recordout])
VALUES
(10, '2019-12-21', '6:00:00 AM', '2:00:00 PM', '2019-12-21 5:18 am', '2019-12-21 2:12 pm'),
(10, '2019-12-23', '8:00:00 AM', '5:00:00 PM', '2019-12-23 7:35 am', '2019-12-23 5:03 pm'),
(10, '2019-12-24', '8:00:00 AM', '5:00:00 PM', NULL, NULL),
(10, '2019-12-25', '8:00:00 AM', '5:00:00 PM', NULL, NULL),
(10, '2019-12-26', '8:00:00 AM', '5:00:00 PM', '2019-12-26 7:48 am', '2019-12-26 5:05 pm'),
(10, '2019-12-27', '8:00:00 AM', '5:00:00 PM', '2019-12-27 7:41 am', '2019-12-27 5:02 pm'),
(10, '2019-12-28', '8:00:00 AM', '5:00:00 PM', '2019-12-28 7:35 am', '2019-12-28 5:07 pm'),
(10, '2019-12-30', '8:00:00 AM', '5:00:00 PM', NULL, NULL),
(10, '2019-12-31', '8:00:00 AM', '5:00:00 PM', NULL, NULL),
(10, '2020-01-01', '8:00:00 AM', '5:00:00 PM', NULL, NULL),
(10, '2020-01-02', '8:00:00 AM', '5:00:00 PM', '2020-01-02 7:41 am', '2020-01-02 5:16 pm'),
(10, '2020-01-03', '8:00:00 AM', '5:00:00 PM', '2020-01-03 7:50 am', '2020-01-03 5:05 pm'),
(10, '2020-01-04', '8:00:00 AM', '5:00:00 PM', '2020-01-04 7:41 am', '2020-01-04 5:04 pm')
;
Query.
SELECT *, (case when datediff(day,
lag(recordin) over (partition by badgenumber order by recordin),
recordin
) >= 1
then lag(recordin) over (partition by badgenumber order by recordin)
else null
end) as prevrecordin,
(case when datediff(day,
lag(recordout) over (partition by badgenumber order by recordout),
recordout
) >= 1
then lag(recordout) over (partition by badgenumber order by recordout)
else null
end) as prevrecordout FROM Table1 ORDER BY scheduledate
Это запрос, который я пытаюсь исправить. с { ссылка } на мой предыдущий вопрос Проверьте, существует ли существующая запись накануне
....
(case when datediff(day,
lag(recordin) over (partition by badgenumber order by recordin),
recordin
) >= 1
then lag(recordin) over (partition by badgenumber order by recordin)
else null
end) as prevrecordin,
(case when datediff(day,
lag(recordout) over (partition by badgenumber order by recordout),
recordout
) >= 1
then lag(recordout) over (partition by badgenumber order by recordout)
else null
end) as prevrecordout,
....
Я не могу найти способ решить это как хорошо, потому что есть расписания, в которых они находятся на следующий день или менее 24 часов / 1 день, я планирую использовать запланированный в качестве параметра для prevrecordin и prevrecordout , есть ли способ сделать это?
Это таблица.
+-------------+--------------+------------+-------------+--------------------+--------------------+
| badgenumber | scheduledate | schedulein | scheduleout | recordin | recordout |
+-------------+--------------+------------+-------------+--------------------+--------------------+
| 10 | 21/12/2019 | 6:00:00 AM | 2:00:00 PM | 21/12/2019 5:18 am | 21/12/2019 2:12 pm |
| 10 | 23/12/2019 | 8:00:00 AM | 5:00:00 PM | 23/12/2019 7:35 am | 23/12/2019 5:03 pm |
| 10 | 24/12/2019 | 8:00:00 AM | 5:00:00 PM | NULL | NULL |
| 10 | 25/12/2019 | 8:00:00 AM | 5:00:00 PM | NULL | NULL |
| 10 | 26/12/2019 | 8:00:00 AM | 5:00:00 PM | 26/12/2019 7:48 am | 26/12/2019 5:05 pm |
| 10 | 27/12/2019 | 8:00:00 AM | 5:00:00 PM | 27/12/2019 7:41 am | 27/12/2019 5:02 pm |
| 10 | 28/12/2019 | 8:00:00 AM | 5:00:00 PM | 28/12/2019 7:35 am | 28/12/2019 5:07 pm |
| 10 | 30/12/2019 | 8:00:00 AM | 5:00:00 PM | NULL | NULL |
| 10 | 31/12/2019 | 8:00:00 AM | 5:00:00 PM | NULL | NULL |
| 10 | 01/01/2020 | 8:00:00 AM | 5:00:00 PM | NULL | NULL |
| 10 | 02/01/2020 | 8:00:00 AM | 5:00:00 PM | 02/01/2020 7:41 am | 02/01/2020 5:16 pm |
| 10 | 03/01/2020 | 8:00:00 AM | 5:00:00 PM | 03/01/2020 7:50 am | 03/01/2020 5:05 pm |
| 10 | 04/01/2020 | 8:00:00 AM | 5:00:00 PM | 04/01/2020 7:41 am | 04/01/2020 5:04 pm |
+-------------+--------------+------------+-------------+--------------------+--------------------+