在 SQL 中检索没有 group by 语句的列值

Posted

技术标签:

【中文标题】在 SQL 中检索没有 group by 语句的列值【英文标题】:Retrieve a column value without group by statement in SQL 【发布时间】:2013-06-08 19:57:54 【问题描述】:

我还需要在我的选择声明中为具有最低价格和最高价格的他们提供 SellerID。以下是查询;请告诉需要什么更改??

Select count(Id) TotalSeller,
       min(price) as MinPrice, ***SellerID_for_min_price***,
       max(price) as MaxPrice, ***SellerID_for_max_price***
  from ProdPrice
 where prodPriceId=1212

数据:

ProdId  SellerID    Price
1212    65  34740
1212    20  34855
1212    88  37299
1212    69  38490
1212    108 39990
1212    35  39999
1212    96  40990

【问题讨论】:

这样的问题有一个完整的标签greatest-n-per-group。类似的问题有相应的大量答案。这个问题中唯一有点新奇的转折是在同一个查询中同时寻找“最小”和“最大”,但这些技术同样适用。 【参考方案1】:

要进行这种查询,您想使用row_number() 来识别具有最小值和最大值的行:

Select count(Id) TotalSeller, min(price) as MinPrice,
       min(case when seqnum_min = 1 then id end) as SellerIdMin,
       max(price),
       min(case when seqnum_max = 1 then id end) as SellerIdMax
from (select pp.*,
             row_number() over (partition by prodPriceId order by price) as seqnum_min,
             row_number() over (partition by prodPriceId order by price desc) as seqnum_max
      from ProdPrice pp
      where prodPriceId=1212
     ) pp

要获取名称,您可以在子查询中进行连接:

Select count(Id) TotalSeller, min(price) as MinPrice,
       min(case when seqnum_min = 1 then SellerName end) as SellerNameMin,
       max(price),
       min(case when seqnum_max = 1 then SellerName end) as SellerNameMax
from (select pp.*, s.SellerName,
             row_number() over (partition by prodPriceId order by price) as seqnum_min,
             row_number() over (partition by prodPriceId order by price desc) as seqnum_max
      from ProdPrice pp join
           Sellers s
           on pp.id = s.id
      where prodPriceId=1212
     ) pp

【讨论】:

感谢您的回答。这就是我一直在寻找的。请多做一点帮助。我在另一张表中有卖家姓名。如何离开外部连接来检索卖家名称,谁有最低和最高价格 非常感谢 Gordon.. 太棒了...非常适合我。

以上是关于在 SQL 中检索没有 group by 语句的列值的主要内容,如果未能解决你的问题,请参考以下文章

关于mysql group by 的设置

选择列表中的列……无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

SQL中where和group by可以连用吗?having算是对检索条件的补充吗?

SQL Server报错:选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

mysql GROUP BY、DISTINCT、ORDER BY语句优化

在 SQL 中选择不在 Group By 中的列