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
相关产品推荐
相关产品推荐

