T-SQL经过日期

时间:2019-04-28 19:42:06

标签: sql sql-server database tsql

我有下表:

Column1     Column2   Column3
04/07/2019    1
04/08/2019    2
04/09/2019    8
04/10/2019    9
04/11/2019    15
04/12/2019    16
04/13/2019    5
04/14/2019    6 
04/15/2019    8
04/16/2019    9 
04/17/2019    10 
04/18/2019    11  
04/19/2019    5 
04/20/2019    5 
04/21/2019    8    
04/22/2019    8 
04/23/2019    9 
04/24/2019    10 
04/25/2019    11  
04/26/2019    12 
04/27/2019    10 

我需要找到一种方法来遍历第一列中的值,并确定应该从星期六至星期日开始的几周。因此,在此示例中,一个迭代应该是从14到20。或者另一个迭代是从7号到13号,即星期六-星期日。然后在确定每个星期之后,我需要对其他列进行一些计算。如果1周内(基于星期六至星期日的Column1)的Column2总数超过40,则计算将更新Column3。然后在一周的下一个迭代中(星期六-星期日)也是如此。

所需结果:

Column1    Column2   Column3
04/07/2019    1        56
04/08/2019    2        56
04/09/2019    8        56
04/10/2019    9        56
04/11/2019    15       56
04/12/2019    16       56
04/13/2019    5        56
04/14/2019    6        54
04/15/2019    8        54
04/16/2019    9        54
04/17/2019    10       54
04/18/2019    11       54
04/19/2019    5        54
04/20/2019    5        54
04/21/2019    8        68
04/22/2019    8        68
04/23/2019    9        68
04/24/2019    10       68
04/25/2019    11       68
04/26/2019    12       68
04/27/2019    10       68

请注意:数据范围可能从3周到几个月。因此,代码需要捕获任何特定范围内的星期。

1 个答案:

答案 0 :(得分:1)

您可以使用datepart()来获取日期的星期。然后,您可以使用星期在窗口sum()中进行分区。从那里,您可以UPDATE将表连接到派生表,该表获得的总和如前所述。为确保一周从星期日开始,请在SET DATEFIRST 7之前发出UPDATE

SET DATEFIRST 7;
UPDATE t1
       SET t1.column3 = t3.column3
       FROM elbat t1
            INNER JOIN (SELECT t2.column1,
                               sum(t2.column2) OVER (PARTITION BY datepart(week, t2.column1)) column3
                               FROM elbat t2) t3
                       ON t3.column1 = t1.column1;

db<>fiddle