我想列出具有价格升序的替代发布商的所有行,请参阅下面的示例表。
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?
答案 0 :(得分:2)
这应该这样做:
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
窗口功能为每个发布商价格分配唯一编号。基于此,外部顺序将首先显示rn = 1的所有行,这些行是具有最低价格的每个发布者的行。每个发布商的第二行具有第二低的价格,依此类推。
SQLFiddle示例:http://sqlfiddle.com/#!4/06ece/2
答案 1 :(得分:1)
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
子句中使用窗口函数。
答案 2 :(得分:0)
不确定你的表名是什么 - 我把它叫做publishertable。但是以下将按价格按升序排序结果 - 这是您要查找的结果:
select id, publisher, price from publishertable order by price asc
答案 3 :(得分:0)
如果我做对了。您应该使用ROW_NUMBER() function来确定每个发布商的价格范围,然后按此范围和发布商进行排序。
SELECT ID,
Publisher,
Price,
Row_number() OVER (PARTITION BY Publisher ORDER BY Price) as rn
FROM T
ORDER BY RN,Publisher