2017-01-11 21 views
1

这个网站一直是我多年来的一个很好的资源,但我终于遇到了一个问题,我找不到已发布的解决方案。创建一个计数器,重置每一个名称的变化

我有一个名称,日期和值的列表。我需要将日期转换为数字,并让他们重新开始每个数值大于0的井。

我的想法是创建一个循环,但我缺乏使其发生的技巧。

我发现一个帖子创建计数器但不知道如何循环播放:

SELECT Name, row_number() over (order by (select NULL)) 
FROM [$ST_MASTER] 

黄列是我想要的创建

enter image description here

+0

请标记正在使用的dbms。此外,请告诉我们是否需要为每个名称进行重置。 –

+0

sql-server 重置必须发生在每个名称更改处。 – robie

+0

如果有值像0,120,0,90,0,10..how应该列值看起来像一个给定的名字?他们应该是0,1,0,2,0,3还是0,1,0,1,0,1? –

回答

0

你是正确的方向。您需要通过两种方式进行更改: 1)您需要重新启动每个名称的行号。 2)当数值变为零时,您需要重新启动行号。 之后,我们只需要放弃零数量行的行号。你会看到我通过使用ZeroOnePartSort值来做到这一点。 这个逻辑中的一个流程:这假设(根据您的数据样本),一旦数量变为正数名称,它们不会再次归零。

WITH ValSort AS (
SELECT Name, CASE WHEN value = 0 THEN 0 ELSE 1 END AS ZeroOnePart, 
    DateStamp, Value FROM dbo.STMaster 
) 
SELECT vs.Name, vs.DateStamp, vs.Value, 
ROW_NUMBER() OVER(PARTITION BY vs.Name, vs.ZeroOnePart 
       ORDER BY vs.DateStamp) * vs.ZeroOnePart 
FROM ValSort vs 
+0

这就像一个冠军。功能的结束和分区对我来说是新的。感谢你们。 – robie

相关问题