如何在sql server中根据条件生成序列号
Posted
技术标签:
【中文标题】如何在sql server中根据条件生成序列号【英文标题】:How to generate the sequence number based on condition in sql server 【发布时间】:2019-08-30 15:12:18 【问题描述】:我需要根据分数 1 或 0 显示一个新序列列值。
MonthlyDate Score New Sequence
----------- ------ ----------
2019-08-01 1 0
2019-08-02 0 1
2019-08-03 0 2
2019-08-04 0 3
2019-08-05 1 0
2019-08-06 0 1
2019-08-07 0 2
2019-08-08 0 3
我正在尝试根据新的序列值在我的项目中实现计算。
我尝试过 sum(score) over (Order By Date rows unbounded before)
Case when Score = 1
THEN 0
ELSE (CASE WHEN LAG(Score) OVER (ORDER BY MonthlyDate) = 0
THEN 1
ELSE (SUM(Score) over (Order by MonthlyDate rows unbounded preceding))
END)
END as NewSequence
【问题讨论】:
你为什么尝试SUM(SCORE)
? Score
是 0。一堆零的和将是零。
这是我最糟糕的部分,我不会那样做。请看我的实际要求。
所以当 score=1 时新序列重置为 0?
@Jamiec,答案是肯定的。
【参考方案1】:
我使用mysql是因为在线工具,但在sql server中非常相似。
SQL DEMO
with cte as (
SELECT *, SUM(Score) OVER (ORDER BY MonthlyDate) as grp
FROM scores
)
SELECT *, ROW_NUMBER() OVER (PARTITION BY grp ORDER BY MonthlyDate) as new_seq
FROM cte
输出
| MonthlyDate | Score | New_Sequence | grp | new_seq |
| ------------------- | ----- | ------------ | --- | ------- |
| 2019-08-01 00:00:00 | 1 | 0 | 1 | 1 |
| 2019-08-02 00:00:00 | 0 | 1 | 1 | 2 |
| 2019-08-03 00:00:00 | 0 | 2 | 1 | 3 |
| 2019-08-04 00:00:00 | 0 | 3 | 1 | 4 |
| 2019-08-05 00:00:00 | 1 | 0 | 2 | 1 |
| 2019-08-06 00:00:00 | 0 | 1 | 2 | 2 |
| 2019-08-07 00:00:00 | 0 | 2 | 2 | 3 |
| 2019-08-08 00:00:00 | 0 | 3 | 2 | 4 |
【讨论】:
实现我的seq start in 1,可以做-1 + row_number()
我希望新序列在分数为 1 时重置为 0
你看到我之前的评论了吗?你真的需要我更新我的答案吗?
谢谢,它工作得很好。如果您想更新答案,那就太好了。再次感谢!
@scsimon 我知道但没有文本到 DDL :(以上是关于如何在sql server中根据条件生成序列号的主要内容,如果未能解决你的问题,请参考以下文章
如何使用实体框架在 Sql Server Express 中获取下一个序列号?