Sql server 有条件运行的sql server

Sql server 有条件运行的sql server,sql-server,sql-server-2014,Sql Server,Sql Server 2014,我打篮球,想在一定条件下记下我的分数。我从不在周六或周日比赛,虽然我不是每周都打 如果我错过了一周一天的训练,我的记录就会重置。如果我输了,我的反弹会重新开始。如果我在周五赢了,下周一又赢了,我的记录应该会继续 以下是一个示例结果集: | Date | Points | Won_Flag | Tally | |------------|--------|----------|-------| | 2015-07-23 | 18 | false | 0 | | 2

我打篮球,想在一定条件下记下我的分数。我从不在周六或周日比赛,虽然我不是每周都打

如果我错过了一周一天的训练,我的记录就会重置。如果我输了,我的反弹会重新开始。如果我在周五赢了,下周一又赢了,我的记录应该会继续

以下是一个示例结果集:

|       Date | Points | Won_Flag | Tally |
|------------|--------|----------|-------|
| 2015-07-23 |     18 |    false |     0 |
| 2015-07-24 |      7 |     true |     7 |
| 2015-07-28 |     10 |     true |    10 |
| 2015-07-29 |     20 |     true |    30 |
| 2015-07-30 |     11 |    false |     0 |
| 2015-07-31 |     18 |     true |    18 |
| 2015-08-01 |     31 |     true |    31 |
| 2015-09-14 |      0 |    false |     0 |
| 2015-09-15 |      8 |     true |     8 |
| 2015-09-16 |     13 |    false |     0 |
| 2015-09-17 |      9 |     true |     9 |
| 2015-09-18 |      1 |     true |    10 |
| 2015-09-21 |      7 |     true |    17 |
| 2015-09-22 |     15 |    false |     0 |
| 2015-10-01 |      9 |    false |     0 |
| 2015-10-02 |      5 |     true |     5 |
| 2015-10-05 |     14 |     true |    19 |
| 2015-10-13 |      3 |     true |     3 |
| 2015-10-14 |     14 |     true |    17 |
| 2015-10-15 |     12 |     true |    29 |
| 2015-10-16 |      8 |     true |    37 |

您可以使用累积和和
lag()。使用
lag()
确定理货是否需要重新开始。然后累积此标志以获取可用于累积和的组标识符:

select t.*, sum(tally) over (partition by grp order by date) as cumeTally
from (select t.*, sum(tallyStartFlag) over (order by date) as grp
      from (select t.*,
                   (case when lag(date) over (order by date)) = datedd(day, -1, date) and
                              datename(weekday, date) in ('Tuesday', 'Wednesday', 'Thursday', 'Friday')
                         then 0
                         when lag(date) over (order by date) = dateadd(day, -3, date) and
                              datename(weekday, date) = 'Monday'
                         then 0
                         else 1
                    end) as tallyStartFlag
            from t
           ) t
     ) t;
周末的处理有点棘手

编辑:

我错过了关于失败的部分。这很容易合并:

select t.*, sum(case when won_flag then tally else 0 end) over (partition by grp order by date) as cumeTally
from (select t.*, sum(tallyStartFlag) over (order by date) as grp
      from (select t.*,
                   (case when won_flag = false
                         then 0
                         when lag(date) over (order by date)) = datedd(day, -1, date) and
                              datename(weekday, date) in ('Tuesday', 'Wednesday', 'Thursday', 'Friday')
                         then 0
                         when lag(date) over (order by date) = dateadd(day, -3, date) and
                              datename(weekday, date) = 'Monday'
                         then 0
                         else 1
                    end) as tallyStartFlag
            from t
           ) t
     ) t;

您可以使用累积和和
lag()。使用
lag()
确定理货是否需要重新开始。然后累积此标志以获取可用于累积和的组标识符:

select t.*, sum(tally) over (partition by grp order by date) as cumeTally
from (select t.*, sum(tallyStartFlag) over (order by date) as grp
      from (select t.*,
                   (case when lag(date) over (order by date)) = datedd(day, -1, date) and
                              datename(weekday, date) in ('Tuesday', 'Wednesday', 'Thursday', 'Friday')
                         then 0
                         when lag(date) over (order by date) = dateadd(day, -3, date) and
                              datename(weekday, date) = 'Monday'
                         then 0
                         else 1
                    end) as tallyStartFlag
            from t
           ) t
     ) t;
周末的处理有点棘手

编辑:

我错过了关于失败的部分。这很容易合并:

select t.*, sum(case when won_flag then tally else 0 end) over (partition by grp order by date) as cumeTally
from (select t.*, sum(tallyStartFlag) over (order by date) as grp
      from (select t.*,
                   (case when won_flag = false
                         then 0
                         when lag(date) over (order by date)) = datedd(day, -1, date) and
                              datename(weekday, date) in ('Tuesday', 'Wednesday', 'Thursday', 'Friday')
                         then 0
                         when lag(date) over (order by date) = dateadd(day, -3, date) and
                              datename(weekday, date) = 'Monday'
                         then 0
                         else 1
                    end) as tallyStartFlag
            from t
           ) t
     ) t;

您应该编辑您的问题并将示例数据和所需结果作为文本放在问题中(在行首使用“{}”或四个空格设置格式)。您应该编辑问题并将示例数据和所需结果作为文本放在问题中(在行首使用“{}”或四个空格设置格式)。有一些语法错误。是正确的版本。它不能解决问题,imho。有一些调整。有一些语法错误。是正确的版本。它不能解决问题,imho。有一些调整。