我有两张桌子:
表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
答案 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
答案 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;