PL/SQL для выбора окна раздела данных
Вопрос
Работаем с Oracle 11g здесь.
Я пытаюсь понять, как написать конкретный запрос к примеру таблицы ниже:
ID TYPE PRIORITY STATUS DATE
----------------------------------------------------
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
2 R B NEW 01-OCT-2009
2 R B NEW 01-OCT-2009
2 R B NEW 01-OCT-2009
2 R B NEW 01-OCT-2009
3 R A NEW 01-OCT-2009
3 Q A NEW 01-OCT-2009
3 Q A NEW 01-OCT-2009
Вот псевдо-PL/SQL того, что я хочу, чтобы запрос сделал:
SELECT ID, TYPE
FROM DATA_TABLE
WHERE ROWNUM = 1 AND STATUS = 'NEW'
GROUP BY ID, TYPE
ORDER BY PRIORITY, DATE
Я хочу получить следующую группу идентификаторов TYPE со статусом NEW, упорядоченную по приоритету и дате.
В приведенном выше случае оператор должен вернуть или 1 квартал или 3 квартал, но не оба, поскольку они имеют одинаковый приоритет и дату.Если для 3 Q установлено значение STATUS='DONE', запрос должен вернуть 1 Q.
На втором этапе я собираюсь снова объединить эти данные с таблицей, чтобы получить строки для набора, который я хочу обработать (например:1 вопрос).Это не обязательно должен быть двухэтапный процесс;если бы я мог получить набор строк для обработки без соединения, это было бы идеально.
Надеюсь, я просто упустил что-то действительно простое, но при необходимости я готов использовать аналитические функции для секционирования.
Решение
SELECT * FROM (SELECT ID, TYPE FROM DATA_TABLE WHERE STATUS = 'NEW' ORDER BY PRIORITY, DATE) WHERE ROWNUM = 1
Это должно сработать.Вы не хотите группировать по идентификатору и ТИПУ, поскольку на самом деле вы не пытаетесь выполнить какое-либо агрегирование строк, соответствующих заданному идентификатору и ТИПУ.Если бы вас интересовал только один столбец (скажем, ДАТА), вы могли бы сказать
SELECT ID, TYPE FROM DATA_TABLE WHERE DATE = (SELECT MIN(DATE) FROM DATA_TABLE) AND ROWNUM = 1
и избегайте сортировки всей таблицы.Но я не вижу, как заставить это работать здесь.