我有以下查询。当Value1字段中的值发生变化时,我试图使Row #增量。SensorData表有2800条记录,Value1为0或3,并且一整天都在变化。
SELECT
ROW_NUMBER() OVER(PARTITION BY Value1 ORDER BY Block ASC) AS Row#,
GatewayDetailID, Block, Value1
FROM
SensorData
ORDER BY
Row#我得到以下结果:

它似乎只创建了2个分区0和3。它不是每次值1更改时都重新启动行号。?
发布于 2019-01-19 16:41:52
首先,我没有创建永久表,而是将其更改为临时表。
所以,考虑到你的例子,我想出了一个例子:
WITH CTE as(
select ROW_NUMBER() OVER(ORDER BY BLOCK) RN, LAG(Value1,1,VALUE1) OVER (ORDER BY BLOCK) LG,
GatewayDetailID, Block, Value1,Value2,Vaule3
from #tmp
),
CTE2 as (
select *, CASE WHEN LG <> VALUE1 THEN RN ELSE 0 END RowMark
from cte
),
CTE3 AS (
select MIN(Block) BL, RowMark from CTE2
GROUP BY ROwMark
),
CTE4 AS (
SELECT GatewayDetailID,Block,Value1,Value2,Vaule3,RMM from cte2 t1
CROSS APPLY (SELECT MAX(ROWMark) RMM FROM CTE3 t9 where t1.Block >= t9.ROwMark and t1.RN >= t9.RowMark) t2
)
SELECT GateWayDetailID,Block,Value1,Value2,Vaule3, ROW_NUMBER() OVER(Partition by RMM ORDER BY BLOCK) RN
FROM CTE4
ORDER BY BLOCK我首先必须获得所有行的行号,然后根据Value1更改的时间,我将其标记为一个新组。从此,我为每个组创建了一个日期和行边界的CTE。最后,我将其交叉应用到表中,以查找每一组中的每一行。
从最后的CTE开始,我只是应用了一个简单的ROW_NUMBER()函数,该函数被每个RowMarker组和poof....row数字分割。
也许有更好的方法可以做到这一点,但这就是我在逻辑上解决问题的方法。
https://stackoverflow.com/questions/54267011
复制相似问题