对分区和分区内的行进行排序

Sort partitions and rows inside the partitions

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

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

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

请求是:

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

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

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

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 |