创建一个计数器,该名称随着名称的每次更改而重置

时间:2017-01-11 21:35:38

标签: sql sql-server tsql date

多年来,这个网站对我来说是一个很好的资源,但我最终遇到了一个问题,我找不到已发布的解决方案。

我有一个名单,日期和价值清单。我需要将日期转换为数字,并让它们重新开始,每个井的值大于0.

我的想法是创造一个循环,但我缺乏实现它的技能。

我找到了一个帖子来创建计数器但不是如何循环它:

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

黄色专栏是我想要创造的

enter image description here

1 个答案:

答案 0 :(得分: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