繁体   English   中英

按聚合选择组上的整行

[英]Select entire row on group by aggregation

我对应该是一个简单的 SQL 查询的东西有些挣扎。

这是我的初始数据库架构:

![初始数据库模式

还准备了SQLFiddle中的例子

我最终得到的查询是:

select
       b.ad_id,
       b.auction_id,
       max(b.amount) as max,
       max(b.created_at) created_at
from bid b
where b.user_id = '601'
group by b.ad_id, b.auction_id

但在结果中,我需要bid表中的整行:

select
       b.id,
       b.ad_id,
       b.auction_id,
       max(b.amount) as max,
       max(b.created_at) created_at
from bid b
where b.user_id = '601'
group by b.ad_id, b.auction_id

失败: [42803] ERROR: column "b.id" must appear in the GROUP BY clause or be used in an aggregate function Position: 16 无法在 GROUP BY 子句中添加id字段,因为它会添加一些我不需要的额外行。

我需要的是从bid表中选择按auction_id 和ad_id 分组的最高记录(金额字段)。

我想我需要进行一些自我内部连接或子选择,但现在我无法编写 SQL。

我需要的是从出价表中选择按auction_id 和ad_id 分组的最高记录(金额字段)

看看文档中的DISTINCT ON 您想要的结果将通过以下查询获得。

select DISTINCT ON (b.ad_id, b.auction_id)
       b.id,
       b.ad_id,
       b.auction_id,
       b.amount
       b.created_at
from bid b
where b.user_id = '601'
ORDER BY b.ad_id, b.auction_id, b.amount DESC

如果您想要给定用户的每次拍卖的最新行,那么您可以使用相关子查询来过滤:

select b.*
from bid b
where b.user_id = '601' and
      b.created_at = (select max(b2.created_at)
                      from bid b2
                      where b2.auction_id = b.auction_id and
                            b2.user_id = b.user_id
                     );

这似乎是对您想要的东西的明智解释。 我不知道是否需要ad_id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM