首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Over分区?

SQL Over分区?
EN

Stack Overflow用户
提问于 2019-01-19 12:17:18
回答 1查看 69关注 0票数 0

我有以下查询。当Value1字段中的值发生变化时,我试图使Row #增量。SensorData表有2800条记录,Value1为0或3,并且一整天都在变化。

代码语言:javascript
复制
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更改时都重新启动行号。?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-19 16:41:52

首先,我没有创建永久表,而是将其更改为临时表。

所以,考虑到你的例子,我想出了一个例子:

代码语言:javascript
复制
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数字分割。

也许有更好的方法可以做到这一点,但这就是我在逻辑上解决问题的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54267011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档