sql - 根据替代发布者选择所有行

标签 sql postgresql sql-order-by window-functions

我想按价格递增的替代出版商列出所有行,请参见下面的示例表。

id publisher   price
1    ABC       100.00
2    ABC       150.00
3    ABC       105.00 
4    XYZ       135.00       
5    XYZ       110.00
6    PQR       105.00
7    PQR       125.00

预期的结果是:

id publisher   price
1    ABC       100.00
6    PQR       105.00
5    XYZ       110.00
3    ABC       105.00
7    PQR       125.00
4    XYZ       135.00       
2    ABC       150.00 

所需的 SQL 是什么?

最佳答案

应该这样做:

select id, publisher, price
from (
  select id, publisher, price,
         row_number() over (partition by publisher order by price) as rn
  from publisher
) t
order by rn, publisher, price

窗口函数为每个发布商价格分配唯一的数字。基于此,外部 order by 将首先显示所有 rn = 1 的行,这些行是每个发布者的价格最低的行。每个发布商的第二行是第二低的价格,依此类推。

SQLFiddle 示例:http://sqlfiddle.com/#!4/06ece/2

关于sql - 根据替代发布者选择所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25363073/

相关文章:

python - 从 CSV 创建具有正确列类型的 SQL 表

java - 使用java字符串的两个日期语句之间的SQL

mysql - Redshift 的 COPY 命令可以复制多个表吗?

mysql - 如何将 NULL 视为最小值?

sql - 将数据从 .txt 文件导入到 SQL Server 2005 Express

sql - vba 从 sql server 记录集中获取值

postgresql - PostGIS - 创建椭圆

postgresql - 如何使用 vagrant 使用 pgadmin 的 GUI 工具

mysql - UNION 查询中的订单字段

sql - 在一列上选择 Distinct,不按该列排序