ВЫБОР пользователя с самым ранним временем и объединение с другими данными

StackOverflow https://stackoverflow.com/questions/1757984

Вопрос

У меня есть база данных 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 быть выбранным для все ценности 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 SELECTed в моем первом запросе.Как мне ограничить свой SELECT user запрос по другому запросу id поле?Это вообще правильный подход, чтобы получить то, что я хочу?

Это было полезно?

Решение

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'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top