选择分钟。具有JOIN的另一个表中的记录的三个值

时间:2014-08-19 07:25:29

标签: sql oracle group-by

我有两张桌子:

表1:文章

Article_ID         Price Valid from         Price ID        
1                  12-Aug-2014              1
1                  30-Dec-2014              2
1                  10-Oct-2014              3
1                  15-Oct-2014              5
2                  13-Aug-2014              1
---(n no. of records for article 2)
3                  01-July-2014             4   
3                  02-July-2014             5   
---(n no. of records for article 3)   

此处唯一键是Article_Id,从日期开始有效。

意味着每篇文章都有不同的价格,这些价格在某些日期有效。从日期开始,一篇文章的相同有效期不能有不同的价格。

表2:价格

Price ID            Price
1                   10
2                   200
3                   30
4                   400
5                   50

必填结果:

我想要每篇文章最低三个价格。为此,我需要一个加入,但我无法弄清楚如何限制否。每篇文章的行价格为3,以及如何实现最小值。标准。

最终结果应为:

Article_ID                     Min Price1      Min Price2    Min Price3
1                              10              30            50
2                              10    
3                              50              400

一篇文章将有最大值。三个价格(在最终结果中),minimun可能是0.它有三个价格是表2中文章的最小价格。

我明白它必须用min做点什么。 (分组)和行号。 (在表2中加入),但任何人都可以帮助我实现它吗?

此致 SJ

2 个答案:

答案 0 :(得分:2)

如果要求仍然是一系列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

Demo SQLfiddle

答案 1 :(得分:0)

这将获取文章表限制中文章的最低价格将帮助您获得所需的最小值:

SELECT
        aa.article_id
      , (
        SELECT min(p.price)
        FROM article a
        LEFT JOIN price p ON (p.price_id = a.price_id)
        WHERE a.article_id = aa.article_id order by p.price limit 1,1
        ) AS minPrice1
    , (
        SELECT min(p.price)
        FROM article a
        LEFT JOIN price p ON (p.price_id = a.price_id)
        WHERE a.article_id = aa.article_id order by p.price limit 2,1
        ) AS minPrice2
    , (
        SELECT min(p.price)
        FROM article a
        LEFT JOIN price p ON (p.price_id = a.price_id)
        WHERE a.article_id = aa.article_id order by p.price limit 3,1
        ) AS minPrice3
FROM article aa;