You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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;

逻辑说明

  1. 子查询中,PARTITION BY acb.card_id将所有出价按卡片分组;ORDER BY acb.bid DESC, acb.time ASC确保每组内出价最高的记录排第一,若出价相同则最早的记录排第一。
  2. ROW_NUMBER()为每组内的记录分配唯一行号,最高出价(或最早的同价出价)的行号为1。
  3. 外层查询筛选行号为1的记录,即可得到每张卡片的目标出价信息,与你给出的理想结果完全匹配。

内容的提问来源于stack exchange,提问作者Enthys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:25:17