如何在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 生成序列号

SQL根据开始和结束时间对满足条件的时间序列进行分组

如何使用实体框架在 Sql Server Express 中获取下一个序列号?

如何确定 SQL Server 2012 中是不是存在序列?

如何懒洋洋地生成一个完成的项目序列并迭代它

SQL Server:如何从 VIEW 中获取序列的 NEXTVAL?