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

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;

不能在WHEREHAVING 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

【讨论】:

以上是关于根据替代发布者选择所有行的主要内容,如果未能解决你的问题,请参考以下文章

根据匹配另一列标识符中所有行的列内容来选择行?

根据同一张表的结果优化选择表中的所有行?

Componentart 网格替代方案

SQL Server 2008 R2中,“选择前1000行”为“选择所有行”

是否有比此查询更具可扩展性的子选择替代方案?

根据在选取器视图中选择的行组件更新表视图数据