SQL:如何从具有最高更改百分比的表中选择项目

时间:2014-01-24 07:12:54

标签: sql oracle subquery max

好的,我完全被难倒了。

我有一张表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;

我知道我需要使用子查询,但我不知道如何去做。

感谢。

编辑:一些示例数据:

Sample Data

4 个答案:

答案 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

SQL Fiddle

希望这对你有帮助!

答案 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;