Как я могу вычислить DateDiff между колонкой одной строки и другой колонкой следующей строки?

Вопрос или проблема

Как я могу вычислить 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 для более ясного представления запроса.

Решение можно представить следующим образом:

  1. Сначала определим структуру таблицы и вставим данные, как указано в вопросе.
  2. Затем напишем 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;

Объяснение запроса:

  1. CTE SurgeryWithDiff:

    • Здесь мы используем оконную функцию LEAD(), чтобы получить значение InRoomTime следующей строки по порядку, разбитой по SurgDate. Это позволит получить следующее время, когда пациент заходит в операционную.
  2. Основной запрос:

    • В основном запросе мы выбираем необходимые поля из CTE, а также рассчитываем разницу времени в минутах между OutRoomTime текущей строки и InRoomTime следующей строки с помощью функции DATEDIFF(MINUTE, OutRoomTime, NextInRoomTime).
  3. Условие WHERE NextInRoomTime IS NOT NULL:
    • Это условие гарантирует, что мы исключаем последнюю строку (если она не имеет следующего времени), где не будет сравнения, так как для последней операции в операции не будет следующего времени.

После выполнения данного запроса, вы получите таблицу с разницей во времени в минутах между выходом из операционной и входом в следующую операционную.

Оцените материал
Добавить комментарий

Капча загружается...