【问题标题】:How to generate the sequence number based on condition in sql server如何在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,答案是肯定的。

标签: sql sql-server


【解决方案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 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
相关资源
最近更新 更多