Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Pilih min. tiga nilai record di tabel lain dengan JOIN

Jika persyaratan tetap untuk pivot 3 harga dalam satu rangkaian, maka gunakan ROW_NUMBER() akan memungkinkan pemberian angka-angka ini 1, 2, 3 dan dari sana ada penggunaan sederhana case expressions dengan group by :

untuk 3 harga terendah:

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

untuk 3 harga terbaru

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

Demo SQLfiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Adakah yang tahu teknik enkripsi apa yang digunakan JDeveloper/SQL Developer untuk mempertahankan kredensial?

  2. Mengulang nilai, membuat kueri dinamis, dan menambahkan ke kumpulan hasil

  3. Apakah ada pernyataan SQL yang akan memecah apa yang akan menjadi 2 kolom panjang menjadi beberapa pasang kolom?

  4. Buat kunci utama unik (hash) dari kolom database

  5. Setara dengan \G MySQL dalam SQL*Plus Oracle