在组内排序

时间:2015-08-31 20:49:43

标签: sql sorting join group-by sql-order-by

我有2个表:@Override public void onBackPressed() { this.finish(); } Items。每个项目属于一个类别。

表项目

Categories

表类别

║ Item_name ║ Category_id ║ Price ║

║ A         ║ Cat_1    ║ 100   ║

║ B         ║ Cat_1    ║ 50    ║

║ C         ║ Cat_2    ║ 98    ║

║ D         ║ Cat_2    ║ 99    ║

║ E         ║ Cat_1    ║ 40    ║

我想按价格对某个类别中的所有商品进行排序。我怎样才能做到这一点?预期结果:

║ Category_id ║ Category_name ║

║ Cat_1       ║ X             ║

║ Cat_2       ║ Y             ║

2 个答案:

答案 0 :(得分:1)

根据您的预期结果,您甚至不需要类别表。只需按所需顺序从项目表中选择。

SELECT i.Item_Name, i.Category_ID, i.Price
    FROM items i
    ORDER BY i.Category_ID, i.price;

但是,如果您想要包含类别名称,则可以进行简单的连接。

SELECT i.Item_Name, i.Category_ID, c.Category_Name, i.Price
    FROM items i
        INNER JOIN categories c
            ON i.Category_ID = c.Category_ID
    ORDER BY i.Category_ID, i.price;

修改 根据评论中的问题,如何返回SQL Server每个类别中最便宜的50个项目。您可以使用公用表表达式(CTE)并利用ROW_NUMBER函数按价格对每个类别中的项目进行编号。

WITH cteOrderByCategory AS (
    SELECT i.item_name, i.Category_ID, i.price,
           ROW_NUMBER() OVER(PARTITION BY i.Category_ID ORDER BY i.price) AS RowNum
        FROM items i
)
SELECT obc.item_name, obc.Category_ID, obc.price
    FROM cteOrderByCategory obc
    WHERE obc.RowNum <= 50
    ORDER BY obc.Category_ID, obc.price;

答案 1 :(得分:1)

无需分组,您只需订购:

select
    i.Item_Name,
    c.Category_name,
    i.Price
from items i
    inner join Categories c on i.category_id = c.category_id
order by c.category_id, i.price