Row_number в SQL

#sql

#sql

Вопрос:

У меня есть эта таблица «triggerTable»

триггер Дата isError
a 2021-02-16 04:08:12.810 0
b 2021-01-31 04:09:22.977 1
c 2021-02-10 04:15:34.740 1
c 2021-02-16 04:16:06.037 0
d 2021-02-12 04:15:34.740 0
d 2021-02-13 04:16:06.037 1
e 2021-01-24 04:15:34.740 0
e 2021-01-31 04:16:06.037 0

Мне нужно иметь для каждого триггера последнюю дату, и если isError (1) или не isError (0). Если сбой триггера (даже НЕ в последнее время) Мне нужна эта строка.

Как я могу получить этот вывод в SQL-скрипте?

триггер Дата isError
a 2021-02-16 04:08:12.810 0
b 2021-01-31 04:09:22.977 1
c 2021-02-10 04:15:34.740 1
d 2021-02-13 04:16:06.037 1
e 2021-01-31 04:16:06.037 0

Спасибо

Комментарии:

1. Если сбой триггера (даже НЕ в последнее время) Мне нужно иметь эту строку — если триггер имеет несколько isError = 1, вам нужен самый ранний, самый последний или все?

2. Самая последняя дата для c is 2021-02-16 04:16:06.037 и not 2021-02-10 04:15:34.740 .

3. @forpas: » Если сбой триггера ( даже НЕ в последнее время) Мне нужна эта строка «.

4. @PM77-1 Тогда в чем смысл этого: мне нужно иметь для каждого триггера последнюю дату, и если isError (1) или не isError (0).

5. @forpas: Я прочитал это как: «Это правило, но у него есть исключение». Я согласен на 100%, что это несколько двусмысленно.

Ответ №1:

Использовать ROW_NUMBER с соответствующим ORDER BY предложением:

 WITH cte AS (
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY "trigger"
                                   ORDER BY isError DESC, date DESC) rn
    FROM triggerTable t
)

SELECT "trigger", date, isError
FROM cte
WHERE rn = 1;
 

снимок экрана из демонстрационной ссылки ниже


ДЕМОНСТРАЦИЯ

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

Ответ №2:

Использование MAX() и FIRST_VALUE() оконные функции:

 SELECT DISTINCT trigger,
       MAX(date) OVER (PARTITION BY trigger) date,
       FIRST_VALUE(isError) OVER (PARTITION BY trigger ORDER BY date DESC) isError
FROM triggerTable
 

Посмотрите демонстрацию.
Результаты:

триггер Дата isError
a 2021-02-16 04:08:12.810 0
b 2021-01-31 04:09:22.977 1
c 2021-02-16 04:16:06.037 0
d 2021-02-13 04:16:06.037 1
e 2021-01-31 04:16:06.037 0

Ответ №3:

Вы можете сделать это с помощью условной агрегации:

 select trigger,
       coalesce(case when isError = 1 then date end,
                max(date)
               ) as date,
       max(isError) as isError
from t
group by trigger;