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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:38:42