sql >> Databasteknik >  >> RDS >> Oracle

Välj min. tre värden för en post i en annan tabell med en JOIN

Om kravet kvarstår för en pivot av 3 priser i en serie, använd ROW_NUMBER() kommer att möjliggöra att ge dessa siffror 1, 2, 3 och därifrån är en enkel användning av case expressions med en group by :

för 3 lägsta priser:

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

för de tre senaste priserna

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. Skapa användare som bara kan SE en databas och bara välja från den?

  2. Access 2021 For Dummies Cheat Sheet

  3. MS Access Corruption Del 2:Bästa metoder för förebyggande och återhämtning

  4. Hur skulle du implementera sekvenser i Microsoft SQL Server?