TSQL按两列分组实现列自增的语法求助
解决TSQL按ID分组生成DateTime自增序列的问题
嘿,我看你是想给每个Tagname(也就是你说的ID)分组,然后在每个组里按ts_DateTime排序生成自增序列对吧?之前的两个查询问题出在分区和排序的逻辑上,我来帮你修正下。
先说说你之前查询的问题
- 第一个查询用了
DENSE_RANK() OVER (ORDER BY hl.Tagname, ts_datetime),这里缺少PARTITION BY子句,所以是对整个表按Tagname+DateTime做全局排名,不是每个ID内部的独立自增。 - 第二个查询的
PARTITION BY ts_DateTime, Tagname把每个ID+DateTime的组合当成了分组,而每个组合通常只有一条数据,所以RowFilter全是1,完全达不到你要的效果。
正确的TSQL写法
要实现「每个ID内部按DateTime排序生成自增序列」,核心是用PARTITION BY指定分组字段(只按Tagname),然后在组内按ts_DateTime排序,再用ROW_NUMBER()生成序号:
SELECT hl.ts_DateTime, hl.Tagname AS [ID], hl.TagValue AS [Value], -- 按Tagname分区,每个分区内按时间升序生成自增序列 ROW_NUMBER() OVER (PARTITION BY hl.Tagname ORDER BY hl.ts_DateTime ASC) AS RowFilter FROM Table1 hl ORDER BY hl.Tagname, hl.ts_DateTime;
逻辑说明
PARTITION BY hl.Tagname:将整个表的数据按ID(Tagname)拆分成独立的分组,每个分组内的计算互不干扰。ORDER BY hl.ts_DateTime ASC:在每个ID分组内,按时间从小到大排序,保证序号是按时间顺序生成的。ROW_NUMBER():给每个分组内的行从1开始依次分配唯一的自增序号,完美匹配你要的「按DateTime拆分后显示自增序列」的需求。
如果你的场景中存在同一ID下同一时间有多条数据,且希望这些数据的序号相同,可以把ROW_NUMBER()换成RANK()或DENSE_RANK(),但通常ROW_NUMBER()是最常用的自增序号方案。
内容的提问来源于stack exchange,提问作者user3904868
相关产品推荐
相关产品推荐

