【问题标题】:Select min. three values of a record in another table with a JOIN选择分钟。另一个表中记录的三个值与 JOIN
【发布时间】:2014-10-12 05:17:25
【问题描述】:

我有两张桌子:

表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 和 Valid from date。

意味着每篇文章都有不同的价格,从特定日期开始有效。一篇文章不能在同一个有效期内有不同的价格。

表 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

【问题讨论】:

  • 向我们展示您的尝试
  • select a.article_id, min(p.price) from article a left outer join price p on (p.price_id = a.price_id) group by(a.article_id ) order by a.article_id;
  • 这里的问题是,我不知道如何将行数设置为 3(如果是联合),除此之外它没有考虑空价格
  • @CodeNewbie :实际上这对我也没有帮助,我刚刚意识到所需的输出是非常不同的。(更新了问题。)仍在试图找出我的出路..让我知道如果你有一些想法。谢谢!

标签: sql oracle group-by


【解决方案1】:

如果仍然需要在一个系列中以 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

【讨论】:

  • 它不起作用,在某些情况下,它在所有三个价格中都返回 null,在某些情况下,它只返回 Price2 col 中的 1 个最小价格,在某些情况下,它选择了错误的值。 PS:我已将 Price_valid_from 更改为 row_number 中的价格(因为我需要最小的 3 个价格而不是最新的 3 个价格)
  • I need smallest 3 Prices 好的,这将改变它。我将添加一个新的变体
  • 如果特定条件没有价格,它将返回 NULL,可以修改为返回 0(更改 case 表达式以包含 ELSE 0)
  • 完美!!非常感谢。 :)
【解决方案2】:

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

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;

【讨论】:

  • Oracle 不支持limit,因此这不适用于这种情况。 (12c 是 introduce equivalent functionality though)。
  • @parixit 在 where 子句中您指的是哪个 article_id?
  • @Alex PooleThanks..replaced Limit with Fetch statement
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2016-06-23
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多