SQL 新手 - 过度分区?
SQL Newbie - Over Partition?
我有以下查询。我试图让 Row # 在 Value1 字段中的值发生变化时递增。 SensorData
table 有 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个partition 0和3,不是每次值1改变的时候都重新开始行号吗?
首先,我没有创建永久 table,而是将其更改为临时 table。
所以,根据你的例子,我想到了:
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,其中包含每个组的日期和行边界。最后,我将其交叉应用回 table 以查找每个组中的每一行。
从最后一个 CTE 开始,我只是应用了一个简单的 ROW_NUMBER() 函数,每个 RowMarker 组和 poof....行号。
可能有更好的方法来做到这一点,但这是我从逻辑上解决问题的方法。
我有以下查询。我试图让 Row # 在 Value1 字段中的值发生变化时递增。 SensorData
table 有 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个partition 0和3,不是每次值1改变的时候都重新开始行号吗?
首先,我没有创建永久 table,而是将其更改为临时 table。
所以,根据你的例子,我想到了:
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,其中包含每个组的日期和行边界。最后,我将其交叉应用回 table 以查找每个组中的每一行。
从最后一个 CTE 开始,我只是应用了一个简单的 ROW_NUMBER() 函数,每个 RowMarker 组和 poof....行号。
可能有更好的方法来做到这一点,但这是我从逻辑上解决问题的方法。