質問

私は、私は特定の条件が満たされている(userフィールドに基づいて)最も古い行からtimeフィールドを選択しようとしているOracleデータベースを持っている、と私はどのように行うのか分かりません。ここに私の質問の主旨だ。

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を選択し、WHERE条件に一致する最古のtime値を持つ行からの値のみを取得する方法がわからないです。私は私のSELECT内の任意の集約関数をやっていないよので、私はHAVINGを使用することができるとは思いません。 「早いtime値」条件、すなわち、私がuseridvalueフィールドののすべてのの値のために選択されるようにしたい、timeフィールドの選択に、ののみのを適用する必要があります。

私は上記の持っているSELECT文を維持し、私がしたい特定のuserを取得し、別のSELECT文でJOINの可能性が考えていた。

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