好的,我完全被难倒了。
我有一张表GROCERY_PRICES。
其中有GROCERY_ITEM,PRICE_IN_2012和ESTIMATED_PRICE_IN_2042的数据。
我需要编写一个SQL SELECT语句,找出价格涨幅最高的项目。然后按GROCERY_ITEM排序。
我不能为我的生活弄清楚如何使用表格中的数据抓住时间段内变化百分比最高的三个项目。
这是我的代码,它返回我需要的所有数据,但是对于每个GROCERY_ITEM而不是具有最高变化百分比的三个项目。我知道它是310但我不能硬编码。
SELECT grocery_item,
price_in_2012,
ESTIMATED_PRICE_IN_2042,
sum((ESTIMATED_PRICE_IN_2042 - PRICE_IN_2012) / PRICE_IN_2012) * 100 as Percent_Change
FROM grocery_prices
GROUP BY grocery_item,
price_in_2012,
ESTIMATED_PRICE_IN_2042
ORDER BY grocery_item;
我知道我需要使用子查询,但我不知道如何去做。
感谢。
编辑:一些示例数据:
答案 0 :(得分:3)
你在找这样的东西吗?
SELECT grocery_item, price_in_2012, estimated_price_in_2042, percent_change
FROM
(
SELECT grocery_item, price_in_2012, estimated_price_in_2042,
ROUND((estimated_price_in_2042 - price_in_2012) / price_in_2012 * 100, 2) AS percent_change,
ROW_NUMBER() OVER (ORDER BY ABS((estimated_price_in_2042 - price_in_2012) / price_in_2012 * 100) DESC) AS rank
FROM grocery_prices t
) q
WHERE rank <= 3;
输出:
| GROCERY_ITEM | PRICE_IN_2012 | ESTIMATED_PRICE_IN_2042 | PERCENT_CHANGE | |--------------|---------------|-------------------------|----------------| | B_001 | 0.8 | 3.28 | 310 | | G_010 | 8 | 32.8 | 310 | | R_003 | 4 | 16.4 | 310 |
根据您的需要,您可能希望使用DENSE_RANK()
代替ROW_NUMBER()
SELECT grocery_item, price_in_2012, estimated_price_in_2042, percent_change
FROM
(
SELECT grocery_item, price_in_2012, estimated_price_in_2042,
ROUND((estimated_price_in_2042 - price_in_2012) / price_in_2012 * 100, 2) AS percent_change,
DENSE_RANK() OVER (ORDER BY ABS((estimated_price_in_2042 - price_in_2012) / price_in_2012 * 100) DESC) AS rank
FROM grocery_prices t
) q
WHERE rank <= 3;
输出:
| GROCERY_ITEM | PRICE_IN_2012 | ESTIMATED_PRICE_IN_2042 | PERCENT_CHANGE | |--------------|---------------|-------------------------|----------------| | B_001 | 0.8 | 3.28 | 310 | | G_010 | 8 | 32.8 | 310 | | R_003 | 4 | 16.4 | 310 | | E_001 | 0.62 | 1.78 | 187.1 | | B_002 | 2.72 | 7.36 | 170.59 |
这是 SQLFiddle 演示
答案 1 :(得分:1)
价格上涨百分比最高的3个项目
SELECT GROCERY_ITEM,PRICE_IN_2012,ESTIMATED_PRICE_IN_2042,
ROUND(((`ESTIMATED_PRICE_IN_2042` - `PRICE_IN_2012`) / PRICE_IN_2012) * 100) AS Percent_Change
FROM grocery_prices AS itm
GROUP BY GROCERY_ITEM
ORDER BY Percent_Change DESC LIMIT 3
希望这对你有帮助!
答案 2 :(得分:0)
select *
from im_employees a
where (select count(distinct employee_id ) from im_employees where employee_id>=a.employee_id)<=3;
这为我选择了来自im_employees表的max employee_id的前三行。
我认为这会对你有所帮助!
答案 3 :(得分:0)
试试这个
select ROCERY_ITEM,PRICE_IN_2012,ESTIMATED_PRICE_IN_2042,round((cast(ESTIMATED_PRICE_IN_2042-PRICE_IN_2012 as numeric)/PRICE_IN_2012)*100,3)||'%' from GROCERY_PRICES order by round((cast(ESTIMATED_PRICE_IN_2042-PRICE_IN_2012 as numeric)/PRICE_IN_2012)*100,3) desc limit 3;
postgresql中的
在oracle中
select rownum,ROCERY_ITEM,PRICE_IN_2012,ESTIMATED_PRICE_IN_2042,round(((ESTIMATED_PRICE_IN_2042-PRICE_IN_2012)/PRICE_IN_2012)*100,3)||'%' from GROCERY_PRICES where rownum < 4 order by round((cast(ESTIMATED_PRICE_IN_2042-PRICE_IN_2012 as numeric)/PRICE_IN_2012)*100,3) desc;