根据备用发布者选择所有行

时间:2014-08-18 12:15:40

标签: 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?

4 个答案:

答案 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;

我无法在WHEREHAVING BY子句中使用window functions的输出,因为在之后应用了窗口函数。但是可以在ORDER BY子句中使用窗口函数。

SQL Fiddle.

答案 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

SQLFiddle demo