Sql server T-SQL-3个月移动和-前面的空值

Sql server T-SQL-3个月移动和-前面的空值,sql-server,tsql,Sql Server,Tsql,使用SQL Server 2016。我有以下数据表(示例) 我想得到一个3个月的移动总和(按月分组): 好的,这应该得到你想要的答案。首先,您需要对您的月份价值进行合计,然后您可以对过去3个月的价值进行连续合计: CREATE TABLE SampleTable (TargetDate date, Total int); GO INSERT INTO SampleTable VALUES ('20180124', 1), ('20180228', 1), ('201

使用SQL Server 2016。我有以下数据表(示例)

我想得到一个3个月的移动总和(按月分组):


好的,这应该得到你想要的答案。首先,您需要对您的月份价值进行合计,然后您可以对过去3个月的价值进行连续合计:

CREATE TABLE SampleTable (TargetDate date, Total int);
GO

INSERT INTO SampleTable
VALUES ('20180124', 1),
       ('20180228', 1),
       ('20180302', 1),
       ('20180308', 1),
       ('20180315', 1),
       ('20180330', 1),
       ('20180416', 1),
       ('20180418', 1),
       ('20180430', 1);
GO

SELECT *
FROM SampleTable;
GO
WITH Months AS (
    SELECT DATEADD(MONTH,DATEDIFF(MONTH, 0, TargetDate),0) AS TargetMonth, SUM(Total) AS MonthTotal
    FROM SampleTable
    GROUP BY DATEADD(MONTH,DATEDIFF(MONTH, 0, TargetDate),0))
SELECT TargetMonth,
       SUM(MonthTotal) OVER (ORDER BY TargetMonth ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS Last3Months
FROM Months;

GO
DROP TABLE SampleTable;
GO
请尝试下面的代码

;WITH CTE(TargetDate,Total)
AS
(
SELECT '2018-01-24', 1 UNION ALL
SELECT '2018-02-28', 1 UNION ALL
SELECT '2018-03-02', 1 UNION ALL
SELECT '2018-03-08', 1 UNION ALL
SELECT '2018-03-15', 1 UNION ALL
SELECT '2018-03-30', 1 UNION ALL
SELECT '2018-04-16', 1 UNION ALL
SELECT '2018-04-18', 1 UNION ALL
SELECT '2018-04-30', 1
)
SELECT STUFF(TargetDate,9,2,'01') AS TargetDate
      ,Total_Sum
FROM
(
    SELECT TargetDate,Total_Sum 
       ,ROW_NUMBER()OVER(PARTITION BY Total_Sum ORDER BY TargetDate) AS Seq
    FROM 
    (
        SELECT  TargetDate
                ,SUM(Total )OVER(ORDER BY MONTH(TargetDate) ) AS Total_Sum
        FROM CTE
    )dt
)fnl 
WHERE Seq=1 
结果

TargetDate  Total_Sum
---------------------
2018-01-01      1
2018-02-01      2
2018-03-01      6
2018-04-01      9

你有连续几个月的记录吗?如果你需要一个总和,为什么你要尝试最大值?这是一个3个月的总和吗?我不知道你是如何计算期望的输出的。无论如何,我同意狗仔队的说法,那不是三个月的总数。例如,我希望4月份的值
17
9
(取决于您是指该月份和前2个月还是前3个月)。当然不是四月份的
8
,我也不知道三月份的
6
值是多少。你能解释一下你的逻辑吗?对不起,让我修改一下。我有一个运行总数,我将发布原始数据谢谢Sirenus,这计算了一个运行总数,对我也很有用。我会试试看!你好,很乐意帮助兄弟
;WITH CTE(TargetDate,Total)
AS
(
SELECT '2018-01-24', 1 UNION ALL
SELECT '2018-02-28', 1 UNION ALL
SELECT '2018-03-02', 1 UNION ALL
SELECT '2018-03-08', 1 UNION ALL
SELECT '2018-03-15', 1 UNION ALL
SELECT '2018-03-30', 1 UNION ALL
SELECT '2018-04-16', 1 UNION ALL
SELECT '2018-04-18', 1 UNION ALL
SELECT '2018-04-30', 1
)
SELECT STUFF(TargetDate,9,2,'01') AS TargetDate
      ,Total_Sum
FROM
(
    SELECT TargetDate,Total_Sum 
       ,ROW_NUMBER()OVER(PARTITION BY Total_Sum ORDER BY TargetDate) AS Seq
    FROM 
    (
        SELECT  TargetDate
                ,SUM(Total )OVER(ORDER BY MONTH(TargetDate) ) AS Total_Sum
        FROM CTE
    )dt
)fnl 
WHERE Seq=1 
TargetDate  Total_Sum
---------------------
2018-01-01      1
2018-02-01      2
2018-03-01      6
2018-04-01      9