#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
is2021-02-16 04:16:06.037
и not2021-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;