Вопрос или проблема
Как я могу вычислить DateDiff между колонкой одной строки и другой колонкой следующей строки?
Я хочу использовать DateDiff, начиная с строки 1, столбец 2, строка 2, столбец 1
CREATE TABLE Surgery
(
AccountNumber varchar(20),
CaseNumber varchar(6),
SurgDate DATETIME,
ORRoom varchar(10),
Surgeon varchar(50),
InRoomTime TIME(3),
OutRoomTime TIME(3)
)
INSERT INTO Surgery
VALUES
(‘11111’, ‘144995’, ‘2024-07-19 00:00:00.000’, ‘OR06’, ‘SOK’, ’07:29′, ’08:30′),
(‘11111’, ‘145017’, ‘2024-07-19 00:00:00.000’, ‘OR06’, ‘SOK’, ’09:00′, ’10:18′),
(‘11111’, ‘145028’, ‘2024-07-19 00:00:00.000’, ‘OR06’, ‘SOK’, ’11:03′, ’13:00′),
(‘11111’, ‘145027’, ‘2024-07-19 00:00:00.000’, ‘OR06’, ‘SOK’, ’13:42′, ’16:20′)
–SELECT * FROM Surgery
SELECT InRoomTime,
(
SELECT OutRoomTime
FROM SURGERY AS table2
WHERE table2.SurgDate = SurgDate AND table2.OutRoomTime < InRoomTime
–ORDER BY OutRoomTime DESC
) AS TOT
FROM SURGERY
Что бы я хотел увидеть:
11111 144995 2024-07-19 00:00:00.000 OR06 SOK 07:29:00.000 08:30:00.000 Разница во времени мин
11111 145017 2024-07-19 00:00:00.000 OR06 SOK 09:00:00.000 10:18:00.000 30
11111 145028 2024-07-19 00:00:00.000 OR06 SOK 11:03:00.000 13:00:00.000 45
11111 145027 2024-07-19 00:00:00.000 OR06 SOK 13:42:00.000 16:20:00.000 158
Ответ или решение
Для расчета разницы во времени между значением столбца OutRoomTime
одной строки и значением столбца InRoomTime
следующей строки в таблице Surgery
, можно использовать подзапрос или CTE (Common Table Expression). В данном случае будет удобно воспользоваться CTE для более ясного представления запроса.
Решение можно представить следующим образом:
- Сначала определим структуру таблицы и вставим данные, как указано в вопросе.
- Затем напишем SQL-запрос, который использует оконные функции для получения нужных значений из предыдущей строки.
Вот полный запрос:
WITH SurgeryWithDiff AS (
SELECT
AccountNumber,
CaseNumber,
SurgDate,
ORRoom,
Surgeon,
InRoomTime,
OutRoomTime,
LEAD(InRoomTime) OVER (PARTITION BY SurgDate ORDER BY InRoomTime) AS NextInRoomTime
FROM
Surgery
)
SELECT
AccountNumber,
CaseNumber,
SurgDate,
ORRoom,
Surgeon,
InRoomTime,
OutRoomTime,
DATEDIFF(MINUTE, OutRoomTime, NextInRoomTime) AS TimeDifferenceMins
FROM
SurgeryWithDiff
WHERE
NextInRoomTime IS NOT NULL
ORDER BY
InRoomTime;
Объяснение запроса:
-
CTE
SurgeryWithDiff
:- Здесь мы используем оконную функцию
LEAD()
, чтобы получить значениеInRoomTime
следующей строки по порядку, разбитой поSurgDate
. Это позволит получить следующее время, когда пациент заходит в операционную.
- Здесь мы используем оконную функцию
-
Основной запрос:
- В основном запросе мы выбираем необходимые поля из CTE, а также рассчитываем разницу времени в минутах между
OutRoomTime
текущей строки иInRoomTime
следующей строки с помощью функцииDATEDIFF(MINUTE, OutRoomTime, NextInRoomTime)
.
- В основном запросе мы выбираем необходимые поля из CTE, а также рассчитываем разницу времени в минутах между
- Условие
WHERE NextInRoomTime IS NOT NULL
:- Это условие гарантирует, что мы исключаем последнюю строку (если она не имеет следующего времени), где не будет сравнения, так как для последней операции в операции не будет следующего времени.
После выполнения данного запроса, вы получите таблицу с разницей во времени в минутах между выходом из операционной и входом в следующую операционную.