如何通过SQL为每张拍卖卡片获取最高出价?GROUP BY使用求助
解决拍卖卡片最高出价检索的SQL问题
现有查询的问题分析
你的两个查询都存在核心问题:
- 两个查询都将
auction_card_bid.id纳入GROUP BY,但这个字段是每条出价的唯一标识,导致每条出价都会单独形成一个分组,完全无法实现按卡片分组取最高出价的需求。 - 第一个查询用了
DISTINCT ON ("auctionCardId")但未指定分组内的排序规则,因此无法保证取到的是最高出价的记录;第二个查询的ORDER BY是全局排序,不是分组内排序,所以会返回所有出价记录,而非每组的最高出价。
正确的SQL解决方案
使用窗口函数ROW_NUMBER()可以精准实现需求:按卡片分组,先按出价降序排序,出价相同时按时间升序排序,取每组的第一条记录(即最高出价,出价相同取最早的)。
SELECT user_id, auction_card_id, bid_id, bid, time FROM ( SELECT acb.user_id, acb.card_id AS auction_card_id, acb.id AS bid_id, acb.bid, acb.time, -- 按卡片分组,组内先按出价降序,再按时间升序分配行号 ROW_NUMBER() OVER ( PARTITION BY acb.card_id ORDER BY acb.bid DESC, acb.time ASC ) AS rn FROM auction_card_bid acb INNER JOIN auction_card ac ON ac.id = acb.card_id ) AS ranked_bids -- 筛选每个卡片分组的第一条记录 WHERE rn = 1;
逻辑说明
- 子查询中,
PARTITION BY acb.card_id将所有出价按卡片分组;ORDER BY acb.bid DESC, acb.time ASC确保每组内出价最高的记录排第一,若出价相同则最早的记录排第一。 ROW_NUMBER()为每组内的记录分配唯一行号,最高出价(或最早的同价出价)的行号为1。- 外层查询筛选行号为1的记录,即可得到每张卡片的目标出价信息,与你给出的理想结果完全匹配。
内容的提问来源于stack exchange,提问作者Enthys
相关产品推荐
相关产品推荐

