排序分区和分区内的行

时间:2019-01-31 18:56:10

标签: postgresql sorting postgresql-8.4

我正在关注本教程: http://www.postgresqltutorial.com/postgresql-window-function/

我正在寻找本教程中未描述的案例,但找不到解决方案。

在本教程的某一时刻,此SELECT查询用于显示按组名分组的产品及其在每个组中升序排列的价格,这是结果:

Sorted by prices inside the partition

请求是:

SELECT
 product_name,
 group_name,
 price,
 ROW_NUMBER () OVER (
 PARTITION BY group_name
 ORDER BY
 price
 )
FROM
 products
INNER JOIN product_groups USING (group_id);

我想像示例中那样按价格对行进行排序,并按字母降序对分区进行排序,例如:

Sorted by prices inside the partition and partitions sorted by name

如何修改请求以获取此结果?

1 个答案:

答案 0 :(得分:2)

ORDER BY后可以跟一个逗号分隔的sort_expressions列表。使用ASCDESC设置每个表达式的排序方向。 ASC(升序)是默认的排序方向。

因此,您可以使用ORDER BY group_name DESC, price

SELECT
 product_name,
 group_name,
 price,
 ROW_NUMBER () OVER (
 PARTITION BY group_name
 ORDER BY
 group_name DESC, price 
 )
FROM
 products
INNER JOIN product_groups USING (group_id);

收益

| product_name       | group_name |   price | row_number |
|--------------------+------------+---------+------------|
| Kindle Fire        | Tablet     |  150.00 |          1 |
| Samsung Galaxy Tab | Tablet     |  200.00 |          2 |
| iPad               | Tablet     |  700.00 |          3 |
| Microsoft Lumia    | Smartphone |  200.00 |          1 |
| HTC One            | Smartphone |  400.00 |          2 |
| Nexus              | Smartphone |  500.00 |          3 |
| iPhone             | Smartphone |  900.00 |          4 |
| Lenovo Thinkpad    | Laptop     |  700.00 |          1 |
| Sony VAIO          | Laptop     |  700.00 |          2 |
| Dell Vostro        | Laptop     |  800.00 |          3 |
| HP Elite           | Laptop     | 1200.00 |          4 |