首页 文章

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

提问于
浏览
1

好吧,我完全难过了 .

我有一张表GROCERY_PRICES .

其中有GROCERY_ITEM,PRICE_IN_2012和ESTIMATED_PRICE_IN_2042的数据 .

我需要编写一个SQL SELECT语句来查找具有最高价格增长百分比的项目 . 然后按GROCERY_ITEM排序 .

我不能为我的生活弄清楚如何使用表中的数据 grab 时间段内具有最高变化百分比的三个项目 .

这是我的代码,它返回我需要的所有数据,但是对于每个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 回答

  • 3

    前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

    希望这对你有所帮助!

  • 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的前三行 .

    我想这会对你有所帮助!

  • 1

    你在找这样的东西吗?

    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 演示

  • 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;
    

相关问题