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

SQL Server分组后如何获取DateTime、INT、FLOAT类型列的首行数据?

嘿,针对你的SQL Server 2014分组后取每组首行数据的需求,我给你两个实用的解决方案,刚好适配你的版本:

方案1:使用ROW_NUMBER()窗口函数(推荐)

这是最常用也最直观的方法,通过窗口函数给每组内的行编号,然后筛选出行号为1的记录,完美支持所有数据类型(包括DATETIME、INT、FLOAT)。

假设你的视图分组列是GroupCol1、GroupCol2,需要取首行的列包括VarcharCol、DateTimeCol、IntCol、FloatCol,示例代码如下:

WITH RankedData AS (
    SELECT 
        GroupCol1,
        GroupCol2,
        VarcharCol,
        DateTimeCol,
        IntCol,
        FloatCol,
        -- 按分组列分区,指定排序规则确定"首行"(比如按创建时间升序取最早的行)
        ROW_NUMBER() OVER (PARTITION BY GroupCol1, GroupCol2 ORDER BY CreateTime ASC) AS RowNum
    FROM YourViewName
)
SELECT 
    GroupCol1,
    GroupCol2,
    VarcharCol,
    DateTimeCol,
    IntCol,
    FloatCol
FROM RankedData
WHERE RowNum = 1;
  • 核心逻辑:PARTITION BY后面跟你的GROUP BY列,把数据按分组列拆分成不同组;ORDER BY指定如何确定每组的首行(比如用时间列、主键列等,必须明确,否则结果不稳定)。
方案2:使用CROSS APPLY关联子查询

如果你的分组列比较少,或者更习惯用关联查询的写法,这个方案也很合适,通过子查询针对每个分组取出首行数据。

示例代码:

SELECT 
    g.GroupCol1,
    g.GroupCol2,
    d.VarcharCol,
    d.DateTimeCol,
    d.IntCol,
    d.FloatCol
FROM (
    -- 先取出所有不重复的分组组合
    SELECT DISTINCT GroupCol1, GroupCol2
    FROM YourViewName
) g
CROSS APPLY (
    -- 针对每个分组取TOP 1,同样要指定排序规则
    SELECT TOP 1 
        VarcharCol,
        DateTimeCol,
        IntCol,
        FloatCol
    FROM YourViewName
    WHERE GroupCol1 = g.GroupCol1 AND GroupCol2 = g.GroupCol2
    ORDER BY CreateTime ASC
) d;

重要提醒:不管用哪种方法,都必须通过ORDER BY明确指定“首行”的判定规则(比如按创建时间最早、主键ID最小等),因为数据库中的行本身是没有固定顺序的,不指定排序规则的话,每次返回的首行可能不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:24:28