ВЫБОР пользователя в кратчайшие сроки и соединение с другими данными - PullRequest
1 голос
/ 18 ноября 2009

У меня есть база данных Oracle, где я пытаюсь выбрать поле user из самой ранней строки (на основе поля time), где выполняются определенные условия, и я не знаю, как это сделать. Вот суть моего запроса:

SELECT id,
       CASE WHEN value = 'xyz'
            THEN 'Pending'
            ELSE 'Not Pending'
       END AS status,
       time
FROM table1
INNER JOIN ...
WHERE subject IN (...) AND
      field = 'Status'

Моя проблема в том, что я не знаю, как ВЫБРАТЬ user и получать только значение из строки с самым ранним значением time, соответствующим условиям WHERE. Я не думаю, что могу использовать HAVING, так как я не делаю никаких агрегатных функций в моем SELECT. «Самое раннее time значение» должно применяться только к для выбора поля user, т. Е. Я хочу, чтобы id и value были выбраны для all значения поля time.

Я думал, что мог бы сохранить приведенный выше оператор SELECT, а затем СОЕДИНИТЬ с другим оператором SELECT, который получает конкретный user, который я хочу.

SELECT id, status, time, user
FROM (
       ...query above...
     ),
     (
       SELECT user
       FROM table1
       WHERE subject in (...) AND
             field = 'Status' AND
             ROWNUM = 1
       ORDER BY time ASC
     )

Однако, это получает только одно значение для user в целом, и должно быть отдельное значение user для каждого id SELECT в моем первом запросе. Как ограничить мой запрос SELECT user полем id другого запроса? Это даже правильный подход, чтобы получить то, что я хочу?

1 Ответ

1 голос
/ 18 ноября 2009
SELECT  id,
        CASE WHEN value = 'xyz'
             THEN 'Pending'
             ELSE 'Not Pending'
        END AS status,
        time,
        FIRST_VALUE(user) OVER (PARTITION BY id ORDER BY time) AS first_user
FROM    table1
INNER JOIN
        ...
WHERE   subject IN (...) AND
        field = 'Status'
...