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

如何筛选表/视图中各分组对应最大VID的记录(SQL Server场景)

按分组筛选每组最大VID记录的SQL Server解决方案

嘿,这两个问题本质上是同一个需求——按游戏ID(Gid)分组,筛选出每组里版本号(VID)最大的所有记录,我给你几个在SQL Server里实操性很强的方案:

方法1:窗口函数(最推荐,简洁高效)

SQL Server 2008及以上版本支持窗口函数,这是处理这类分组筛选问题最直观的方式,还能保留同一Gid+最大VID下的所有明细记录:

WITH RankedGames AS (
    SELECT 
        vid,
        gid,
        otherData,
        -- 为每一行计算其所属Gid组的最大VID
        MAX(vid) OVER (PARTITION BY gid) AS MaxVidPerGid
    FROM YourViewName -- 替换成你的实际视图名称
)
SELECT vid, gid, otherData
FROM RankedGames
WHERE vid = MaxVidPerGid;

逻辑说明

  • 先用CTE(公共表表达式)给原视图的每一行附加一个MaxVidPerGid字段,这个字段是当前行所属Gid组的最大VID值
  • 最后只筛选出vid等于MaxVidPerGid的行,就能得到每个Gid下所有VID为最大值的记录

方法2:子查询+INNER JOIN(兼容旧版本)

如果你的SQL Server版本比较老,或者更习惯传统的分组关联写法,可以用这个方案:

SELECT v.vid, v.gid, v.otherData
FROM YourViewName v -- 替换成你的实际视图名称
INNER JOIN (
    -- 先通过GROUP BY找出每个Gid对应的最大VID
    SELECT gid, MAX(vid) AS MaxVid
    FROM YourViewName
    GROUP BY gid
) max_vids ON v.gid = max_vids.gid AND v.vid = max_vids.MaxVid;

逻辑说明

  • 子查询先按Gid分组,计算出每个组的最大VID
  • 再将原视图和这个子查询结果通过Gid和VID关联,筛选出匹配的所有行

方法3:EXISTS子句(逻辑反向验证)

这个方案用反向逻辑实现,思路是“找出不存在同Gid且VID更大的记录”,也就是当前行的VID是该Gid下的最大值:

SELECT vid, gid, otherData
FROM YourViewName v -- 替换成你的实际视图名称
WHERE NOT EXISTS (
    SELECT 1
    FROM YourViewName v2
    WHERE v2.gid = v.gid AND v2.vid > v.vid
);

逻辑说明

  • 对原视图的每一行,检查是否存在同Gid但VID更大的记录
  • 如果不存在,说明当前行的VID就是该Gid下的最大值,保留该行

以上三种方案都能完美匹配你的需求,比如你示例中的Gid=1会保留所有VID=3的记录,Gid=5也会保留所有VID=3的记录。你可以根据自己的SQL Server版本和习惯选择合适的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:47:35