sql >> データベース >  >> RDS >> Oracle

最小を選択します。 JOINを持つ別のテーブルのレコードの3つの値

    一連の3つの価格のピボットの要件が残っている場合は、ROW_NUMBER()を使用します。 これらの数値1、2、3を指定できるようになり、そこからcase expressionsを簡単に使用できます。 group by

    3つの最低価格の場合:

    SELECT
          a.article_id
        , MAX(CASE
                WHEN a.price_seq = 1 THEN p.price END) AS price_1
        , MAX(CASE
                WHEN a.price_seq = 2 THEN p.price END) AS price_2
        , MAX(CASE
                WHEN a.price_seq = 3 THEN p.price END) AS price_3
    FROM (
                SELECT
                      article_id
                    , price_valid_from
                    , price_id
                    , ROW_NUMBER() OVER (PARTITION BY article_id
                                         ORDER BY p.price ASC) AS price_seq
                FROM article
                      LEFT OUTER JOIN price p
                                  ON (a.price_id = p.price_id)
          ) a
    GROUP BY
          a.article_id
    ORDER BY
          a.article_id
    

    最新の3つの価格

    SELECT
          a.article_id
        , MAX(CASE
                WHEN a.price_seq = 1 THEN p.price END) AS price_1
        , MAX(CASE
                WHEN a.price_seq = 2 THEN p.price END) AS price_2
        , MAX(CASE
                WHEN a.price_seq = 3 THEN p.price END) AS price_3
    FROM (
                SELECT
                      article_id
                    , price_valid_from
                    , price_id
                    , ROW_NUMBER() OVER (PARTITION BY article_id
                                         ORDER BY price_valid_from DESC) AS price_seq
                FROM article
          ) a
          LEFT OUTER JOIN price p
                      ON (a.price_id = p.price_id)
    GROUP BY
          (a.article_id)
    ORDER BY
          a.article_id
    

    デモSQLfiddle



    1. *とフィールド名のリストを使用したSELECTステートメントのパフォーマンス

    2. 文字を複数文字の文字列に置き換えます

    3. サブクエリを使用せずに最大シーケンスの行のみを選択する方法は?

    4. すべてのテーブルを一度に修復する