Получение min и max секционированных данных с помощью фильтра

108
6

Я просто нашел эту проблему в запросе: (Извините, я попытаюсь упростить определения таблиц и сократить детали. Если вам нужно еще немного, скажите, пожалуйста).

У меня есть таблица с (ID, date, status). ID - это FK, date - дата, а status - значение int от 1 до 5. И date и status разрешают нулевые значения. Также допускаются повторяющиеся значения.

Что мне нужно: Извлечь одну строку для каждого ID, min(date) имеющую статус 1 или 2, min(date) имеющих status 2 (только), max(status)...

Я полностью потерял... Я пытаюсь использовать

SELECT
ID,
min(date) over (partition by(status)) ?? as min_12_date,
min(date) over (partition by(status)) ?? as min_2_date,
max(status) as max_status
FROM table
group by ID

Итак, вопрос в том, правильно ли это? Как я могу выбрать только status я хочу?

спросил(а) 2021-01-25T15:04:05+03:00 4 месяца, 3 недели назад
1
Решение
63

Если я правильно понимаю ваш вопрос, для этого вам не нужны аналитические функции. Вам нужна только условная агрегация:

select id,
min(case when status in (1, 2) then date end) as min_12_date,
min(case when status = 2 then date end) as min_2_date,
max(status) as max_status
from tbl
group by id

ответил(а) 2021-01-25T15:04:05+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема