Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按日期滚动过去7天的运行总计,不受SQL表中每一行的前几行的约束,而是受前几行的约束_Sql_Sql Server_Sql Server 2016 - Fatal编程技术网

按日期滚动过去7天的运行总计,不受SQL表中每一行的前几行的约束,而是受前几行的约束

按日期滚动过去7天的运行总计,不受SQL表中每一行的前几行的约束,而是受前几行的约束,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我正在为一个特定的MS SQL计算而挣扎 我试图计算每个日期最近7天的运行总数。然而,数据中有时会出现缺口,因此使用窗口函数很困难。我不希望对最后7行或条目求和,而是按日期求和 例如,日期为“2017-01-30”的行应将其自身和之前的行汇总为“2017-01-24”,因为这是在过去7天内 我尝试了几种使用窗口函数进行编码的方法,也尝试了将其左键连接到一个日历表(其中包含所有日期),但仍然存在差距 这让我非常头疼,因为我100%肯定我错过了什么——当然有一种简单的方法我无法理解 数据位于具有ID

我正在为一个特定的MS SQL计算而挣扎

我试图计算每个日期最近7天的运行总数。然而,数据中有时会出现缺口,因此使用窗口函数很困难。我不希望对最后7行或条目求和,而是按日期求和

例如,日期为“2017-01-30”的行应将其自身和之前的行汇总为“2017-01-24”,因为这是在过去7天内

我尝试了几种使用窗口函数进行编码的方法,也尝试了将其左键连接到一个日历表(其中包含所有日期),但仍然存在差距

这让我非常头疼,因为我100%肯定我错过了什么——当然有一种简单的方法我无法理解

数据位于具有ID列(bigint)、日期列(date)和数字列(money)的表中

数据样本(不包括ID,不需要它,因为它是非唯一且可为空的):

所需结果集示例:

如果任何一位微软的SQL天才能够帮我写一段代码来拯救我的生命,我将非常感激

非常感谢

Shaun

如果你使用了一种新的方法,这项任务就变得非常简单:

CREATE TABLE #Sample (DateColumn date, NumberColumn decimal(7,4));
GO
INSERT INTO #Sample
VALUES
('20170101',8.5215 ),
('20170102',17.043 ),
('20170105',8.5361 ),
('20170109',8.6401 ),
('20170109',17.2801),
('20170116',17.6041),
('20170119',8.652  ),
('20170124',17.1984),
('20170124',8.5992 ),
('20170130',8.5317 ),
('20170201',8.5536 ),
('20170202',8.5463 ),
('20170206',8.6222 ),
('20170206',17.2444),
('20170213',16.988 ),
('20170214',8.4796 ),
('20170221',21.2206),
('20170227',8.5106 ),
('20170228',8.5222 );
GO
WITH CTE AS(
    SELECT S.DateColumn, S.NumberColumn,
           SUM(S.NumberColumn) OVER (ORDER BY DD.Date ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) AS RunningTotal
    FROM DimDate DD --This is your Calendar Table
         LEFT JOIN #Sample S ON DD.Date = S.DateColumn)
SELECT *
FROM CTE WHERE DateColumn IS NOT NULL
ORDER BY DateColumn;

GO

DROP TABLE #Sample;
如果您使用了一个新工具,此任务将变得非常琐碎:

CREATE TABLE #Sample (DateColumn date, NumberColumn decimal(7,4));
GO
INSERT INTO #Sample
VALUES
('20170101',8.5215 ),
('20170102',17.043 ),
('20170105',8.5361 ),
('20170109',8.6401 ),
('20170109',17.2801),
('20170116',17.6041),
('20170119',8.652  ),
('20170124',17.1984),
('20170124',8.5992 ),
('20170130',8.5317 ),
('20170201',8.5536 ),
('20170202',8.5463 ),
('20170206',8.6222 ),
('20170206',17.2444),
('20170213',16.988 ),
('20170214',8.4796 ),
('20170221',21.2206),
('20170227',8.5106 ),
('20170228',8.5222 );
GO
WITH CTE AS(
    SELECT S.DateColumn, S.NumberColumn,
           SUM(S.NumberColumn) OVER (ORDER BY DD.Date ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) AS RunningTotal
    FROM DimDate DD --This is your Calendar Table
         LEFT JOIN #Sample S ON DD.Date = S.DateColumn)
SELECT *
FROM CTE WHERE DateColumn IS NOT NULL
ORDER BY DateColumn;

GO

DROP TABLE #Sample;

试试这个。这可能有助于:

DECLARE @Tab TABLE(DateColumn date, NumberColumn decimal(7,4))
INSERT INTO @Tab
VALUES ('20170101',8.5215 ),
        ('20170102',17.043 ),
        ('20170105',8.5361 ),
        ('20170109',8.6401 ),
        ('20170109',17.2801),
        ('20170116',17.6041),
        ('20170119',8.652  ),
        ('20170124',17.1984),
        ('20170124',8.5992 ),
        ('20170130',8.5317 ),
        ('20170201',8.5536 ),
        ('20170202',8.5463 ),
        ('20170206',8.6222 ),
        ('20170206',17.2444),
        ('20170213',16.988 ),
        ('20170214',8.4796 ),
        ('20170221',21.2206),
        ('20170227',8.5106 ),
        ('20170228',8.5222 )

SELECT T.DateColumn,T.NumberColumn Number
    ,SUM(CASE WHEN T1.DateColumn BETWEEN DATEADD(DAY,-6,T.DateColumn) AND T.DateColumn THEN T1.NumberColumn END) AggregatedNumber
FROM @Tab T
LEFT JOIN @Tab T1 ON T1.DateColumn IS NOT NULL
GROUP BY T.DateColumn,T.NumberColumn
输出:

DateColumn  Number  AggregatedNumber
2017-01-01  8.5215  8.5215
2017-01-02  17.0430 25.5645
2017-01-05  8.5361  34.1006
2017-01-09  8.6401  34.4563
2017-01-09  17.2801 34.4563
2017-01-16  17.6041 17.6041
2017-01-19  8.6520  26.2561
2017-01-24  8.5992  34.4496
2017-01-24  17.1984 34.4496
2017-01-30  8.5317  34.3293
2017-02-01  8.5536  17.0853
2017-02-02  8.5463  25.6316
2017-02-06  8.6222  42.9665
2017-02-06  17.2444 42.9665
2017-02-13  16.9880 16.9880
2017-02-14  8.4796  25.4676
2017-02-21  21.2206 21.2206
2017-02-27  8.5106  29.7312
2017-02-28  8.5222  17.0328

试试这个。这可能有助于:

DECLARE @Tab TABLE(DateColumn date, NumberColumn decimal(7,4))
INSERT INTO @Tab
VALUES ('20170101',8.5215 ),
        ('20170102',17.043 ),
        ('20170105',8.5361 ),
        ('20170109',8.6401 ),
        ('20170109',17.2801),
        ('20170116',17.6041),
        ('20170119',8.652  ),
        ('20170124',17.1984),
        ('20170124',8.5992 ),
        ('20170130',8.5317 ),
        ('20170201',8.5536 ),
        ('20170202',8.5463 ),
        ('20170206',8.6222 ),
        ('20170206',17.2444),
        ('20170213',16.988 ),
        ('20170214',8.4796 ),
        ('20170221',21.2206),
        ('20170227',8.5106 ),
        ('20170228',8.5222 )

SELECT T.DateColumn,T.NumberColumn Number
    ,SUM(CASE WHEN T1.DateColumn BETWEEN DATEADD(DAY,-6,T.DateColumn) AND T.DateColumn THEN T1.NumberColumn END) AggregatedNumber
FROM @Tab T
LEFT JOIN @Tab T1 ON T1.DateColumn IS NOT NULL
GROUP BY T.DateColumn,T.NumberColumn
输出:

DateColumn  Number  AggregatedNumber
2017-01-01  8.5215  8.5215
2017-01-02  17.0430 25.5645
2017-01-05  8.5361  34.1006
2017-01-09  8.6401  34.4563
2017-01-09  17.2801 34.4563
2017-01-16  17.6041 17.6041
2017-01-19  8.6520  26.2561
2017-01-24  8.5992  34.4496
2017-01-24  17.1984 34.4496
2017-01-30  8.5317  34.3293
2017-02-01  8.5536  17.0853
2017-02-02  8.5463  25.6316
2017-02-06  8.6222  42.9665
2017-02-06  17.2444 42.9665
2017-02-13  16.9880 16.9880
2017-02-14  8.4796  25.4676
2017-02-21  21.2206 21.2206
2017-02-27  8.5106  29.7312
2017-02-28  8.5222  17.0328

这是一种在CTE中生成联接表的技术,它使用DATEADD来确定要联接到每一行的日期,然后使用它进行自联接以获得总和。不需要窗口功能

WITH Sample
AS
(
    SELECT *
    FROM 
    (
        VALUES 
        ('2017-01-01', 8.5215),
        ('2017-01-02', 17.043),
        ('2017-01-05', 8.5361),
        ('2017-01-09', 8.6401),
        ('2017-01-09', 17.2801),
        ('2017-01-16', 17.6041),
        ('2017-01-19', 8.652),
        ('2017-01-24', 17.1984),
        ('2017-01-24', 8.5992),
        ('2017-01-30', 8.5317),
        ('2017-02-01', 8.5536),
        ('2017-02-02', 8.5463),
        ('2017-02-06', 8.6222),
        ('2017-02-06', 17.2444),
        ('2017-02-13', 16.988),
        ('2017-02-14', 8.4796),
        ('2017-02-21', 21.2206),
        ('2017-02-27', 8.5106),
        ('2017-02-28', 8.5222)
        ) AS DataSample(Date, Number)
),
TALLY
AS
(
    SELECT *
    FROM (VALUES (0),(-1),(-2),(-3),(-4),(-5),(-6)) AS a(Num)
),
IncludedDates
As
(

    SELECT [Date], DateAdd(d, Tally.Num, [Date]) AS IncludeDate
    FROM Sample
    CROSS APPLY TallY
)
SELECT S1.[Date], SUM(s2.Number) as Total
FROM Sample S1
INNER JOIN IncludedDates ID
    ON S1.[Date] = Id.[Date]
INNER JOIN Sample S2
    ON S2.[Date] = ID.[IncludeDate]
--WHERE S1.[Date] = '2017-01-30'
GROUP BY s1.[Date]

这是一种在CTE中生成联接表的技术,它使用DATEADD来确定要联接到每一行的日期,然后使用它进行自联接以获得总和。不需要窗口功能

WITH Sample
AS
(
    SELECT *
    FROM 
    (
        VALUES 
        ('2017-01-01', 8.5215),
        ('2017-01-02', 17.043),
        ('2017-01-05', 8.5361),
        ('2017-01-09', 8.6401),
        ('2017-01-09', 17.2801),
        ('2017-01-16', 17.6041),
        ('2017-01-19', 8.652),
        ('2017-01-24', 17.1984),
        ('2017-01-24', 8.5992),
        ('2017-01-30', 8.5317),
        ('2017-02-01', 8.5536),
        ('2017-02-02', 8.5463),
        ('2017-02-06', 8.6222),
        ('2017-02-06', 17.2444),
        ('2017-02-13', 16.988),
        ('2017-02-14', 8.4796),
        ('2017-02-21', 21.2206),
        ('2017-02-27', 8.5106),
        ('2017-02-28', 8.5222)
        ) AS DataSample(Date, Number)
),
TALLY
AS
(
    SELECT *
    FROM (VALUES (0),(-1),(-2),(-3),(-4),(-5),(-6)) AS a(Num)
),
IncludedDates
As
(

    SELECT [Date], DateAdd(d, Tally.Num, [Date]) AS IncludeDate
    FROM Sample
    CROSS APPLY TallY
)
SELECT S1.[Date], SUM(s2.Number) as Total
FROM Sample S1
INNER JOIN IncludedDates ID
    ON S1.[Date] = Id.[Date]
INNER JOIN Sample S2
    ON S2.[Date] = ID.[IncludeDate]
--WHERE S1.[Date] = '2017-01-30'
GROUP BY s1.[Date]

这可能会有帮助-试试我的答案,希望它有帮助。这可能会有帮助-试试我的答案,希望它有帮助。我没有想到用CTE来做这件事,这是我要用的。我没有想到用CTE来做这件事,这是我要用的。