根据替代发布者选择所有行
Posted
技术标签:
【中文标题】根据替代发布者选择所有行【英文标题】:Select all rows based on alternative publisher 【发布时间】:2014-08-18 12:15:39 【问题描述】:我想按价格升序列出替代发布商的所有行,请参阅下面的示例表。
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 是什么?
【问题讨论】:
为什么115.00在第一行属于XYZ,第二行属于PQR? 我已经更新了问题 【参考方案1】:应该这样做:
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
【讨论】:
【参考方案2】:SELECT id, publisher, price
FROM tbl
ORDER BY row_number() OVER (PARTITION BY publisher ORDER BY price), publisher;
不能在WHERE
或HAVING BY
子句中使用window functions 的输出,因为窗口函数是在之后 应用的。但是可以在ORDER BY
子句中使用窗口函数。
SQL Fiddle.
【讨论】:
【参考方案3】:不确定您的表名称是什么 - 我称它为发布者表。但以下将按价格升序排列结果 - 这是您正在寻找的结果:
select id, publisher, price from publishertable order by price asc
【讨论】:
我还需要根据发布者进行排序 我不明白你在找什么。 查询将按照您在预期结果中指定的顺序返回结果。【参考方案4】:如果我做对了。您应该使用ROW_NUMBER() function 来确定每个发布者的价格范围,然后按此范围和发布者进行排序。
SELECT ID,
Publisher,
Price,
Row_number() OVER (PARTITION BY Publisher ORDER BY Price) as rn
FROM T
ORDER BY RN,Publisher
SQLFiddle demo
【讨论】:
以上是关于根据替代发布者选择所有行的主要内容,如果未能解决你的问题,请参考以下文章