对分区和分区内的行进行排序
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 列表。使用 ASC
或 DESC
设置每个表达式的排序方向。 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 |
我正在学习本教程: 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 列表。使用 ASC
或 DESC
设置每个表达式的排序方向。 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 |