多年来,这个网站对我来说是一个很好的资源,但我最终遇到了一个问题,我找不到已发布的解决方案。
我有一个名单,日期和价值清单。我需要将日期转换为数字,并让它们重新开始,每个井的值大于0.
我的想法是创造一个循环,但我缺乏实现它的技能。
我找到了一个帖子来创建计数器但不是如何循环它:
SELECT Name, row_number() over (order by (select NULL))
FROM [$ST_MASTER]
黄色专栏是我想要创造的
答案 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