2016-09-28 5 views
0

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

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

Что мне нужно: Extract один ряд для каждого 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?

ответ

1

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

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 
+0

Спасибо большое! Я был запутан с разделами ... – Tistkle