Вопрос

Работаем с 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

и избегайте сортировки всей таблицы.Но я не вижу, как заставить это работать здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top