Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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
Sql server SSMS每周各天的滚动平均值_Sql Server_Ssms - Fatal编程技术网

Sql server SSMS每周各天的滚动平均值

Sql server SSMS每周各天的滚动平均值,sql-server,ssms,Sql Server,Ssms,领导层想知道与工作周的其他时间相比,队友在周一和周五的表现如何。下面是一个队友X在两个月内每日表现的临时dbo示例。每个后来的队友都有一个不同的起点来衡量他们。我最初考虑将无界前置项和各种开始日期结合使用,但windows函数并不配合。救命啊 CREATE TABLE #RollingAverage ( [Date] DATE PRIMARY KEY ,[Value] INT ); INSERT INTO #RollingAverage SELECT '2019-0

领导层想知道与工作周的其他时间相比,队友在周一和周五的表现如何。下面是一个队友X在两个月内每日表现的临时dbo示例。每个后来的队友都有一个不同的起点来衡量他们。我最初考虑将无界前置项和各种开始日期结合使用,但windows函数并不配合。救命啊

CREATE TABLE #RollingAverage
(
    [Date]     DATE PRIMARY KEY
    ,[Value]   INT
);

INSERT INTO #RollingAverage
SELECT '2019-01-02',626
UNION ALL SELECT '2019-01-03',231 UNION ALL SELECT '2019-01-04',572
UNION ALL SELECT '2019-01-07',775 UNION ALL SELECT '2019-01-09',660
UNION ALL SELECT '2019-01-10',662 UNION ALL SELECT '2019-01-11',541
UNION ALL SELECT '2019-01-14',849 UNION ALL SELECT '2019-01-15',632
UNION ALL SELECT '2019-01-16',906 UNION ALL SELECT '2019-01-18',961
UNION ALL SELECT '2019-01-21',501 UNION ALL SELECT '2019-01-24',311
UNION ALL SELECT '2019-01-25',614 UNION ALL SELECT '2019-01-28',296
UNION ALL SELECT '2019-01-29',390 UNION ALL SELECT '2019-01-31',804
UNION ALL SELECT '2019-02-01',928 UNION ALL SELECT '2019-02-05',855
UNION ALL SELECT '2019-02-06',605 UNION ALL SELECT '2019-02-08',283
UNION ALL SELECT '2019-02-12',144 UNION ALL SELECT '2019-02-14',382
UNION ALL SELECT '2019-02-15',862 UNION ALL SELECT '2019-02-18',549
UNION ALL SELECT '2019-02-19',401 UNION ALL SELECT '2019-02-20',515
UNION ALL SELECT '2019-02-21',590 UNION ALL SELECT '2019-02-22',625
UNION ALL SELECT '2019-02-25',304 UNION ALL SELECT '2019-02-26',402
UNION ALL SELECT '2019-02-27',326;

AVG(Value)over(在无界的前一行和当前行之间按[Date]行排序)
不起作用

您需要了解的第一件事是,您的“每日”性能不是每日的。一个简单的解决办法是填补空白,以便能够有效地计算天数

我使用一个CTE来填补空白,它可以动态生成一个日历表,但是如果可用的话,您可以使用一个永久的日历表

WITH 
E(n) AS(
    SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))E(n)
),
E2(n) AS(
    SELECT a.n FROM E a, E b
),
cteCalendar(calDate) AS(
    SELECT TOP (61) 
        CAST( DATEADD( DD, 1-ROW_NUMBER() OVER(ORDER BY (SELECT NULL)), GETDATE()) AS date) AS calDate
    FROM E2
),
cteRollingAverages AS(        
    SELECT ra.[Date], 
        ra.value,
        AVG(Value) over (ORDER BY calDate ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) RollingAverage
    FROM #RollingAverage AS ra
    RIGHT JOIN cteCalendar AS c ON ra.[Date] = c.calDate
)
SELECT *
FROM cteRollingAverages
WHERE [Date] IS NOT NULL
ORDER BY [Date];
另一个选项是使用APPLY。这不受特定日期的限制

SELECT *
FROM #RollingAverage r
CROSS APPLY( SELECT AVG(i.[Value]) AS RollingAvg
            FROM #RollingAverage i
            WHERE i.[Date] BETWEEN DATEADD( DD, -7, r.[Date]) AND r.[Date]) av
ORDER BY [Date];

你首先需要了解的是,你的“每日”表现不是每日的。一个简单的解决办法是填补空白,以便能够有效地计算天数

我使用一个CTE来填补空白,它可以动态生成一个日历表,但是如果可用的话,您可以使用一个永久的日历表

WITH 
E(n) AS(
    SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))E(n)
),
E2(n) AS(
    SELECT a.n FROM E a, E b
),
cteCalendar(calDate) AS(
    SELECT TOP (61) 
        CAST( DATEADD( DD, 1-ROW_NUMBER() OVER(ORDER BY (SELECT NULL)), GETDATE()) AS date) AS calDate
    FROM E2
),
cteRollingAverages AS(        
    SELECT ra.[Date], 
        ra.value,
        AVG(Value) over (ORDER BY calDate ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) RollingAverage
    FROM #RollingAverage AS ra
    RIGHT JOIN cteCalendar AS c ON ra.[Date] = c.calDate
)
SELECT *
FROM cteRollingAverages
WHERE [Date] IS NOT NULL
ORDER BY [Date];
另一个选项是使用APPLY。这不受特定日期的限制

SELECT *
FROM #RollingAverage r
CROSS APPLY( SELECT AVG(i.[Value]) AS RollingAvg
            FROM #RollingAverage i
            WHERE i.[Date] BETWEEN DATEADD( DD, -7, r.[Date]) AND r.[Date]) av
ORDER BY [Date];

定义“不起作用”。如果出现错误,错误消息是什么?如果您得到了结果,那么它们有什么问题?我得到的错误是“ROWS”附近的语法不正确,“Define”不起作用。如果出现错误,错误消息是什么?如果你得到了结果,它们有什么问题?我得到的错误是“行附近的语法不正确”,我明白你的意思。我不想在计数中包含NULL或0值。样本集中缺少的日期表示缺勤天数。我只想计算活动日的平均性能。查询不包括NULL或0值。聚合函数(包括窗口函数)会忽略空值,我们不会添加零来包含它们。但是,您需要添加缺失的日期以保持行数的一致性。当我获得6个月的数据乘以其他队友时,我是否必须填充所有这些空日。有没有更简单的方法来编译这个条件聚合?我添加了一个不同的选项,它可能会更好地为您服务。我建议你在表现上比较一下。谢谢,路易斯。我觉得这个术语将我的最终目标与此区分开来。我不是在寻找一个“移动平均线”(过去X天),而是从一个初始的出发点,有条件地向前发展。我明白你在说什么。我不想在计数中包含NULL或0值。样本集中缺少的日期表示缺勤天数。我只想计算活动日的平均性能。查询不包括NULL或0值。聚合函数(包括窗口函数)会忽略空值,我们不会添加零来包含它们。但是,您需要添加缺失的日期以保持行数的一致性。当我获得6个月的数据乘以其他队友时,我是否必须填充所有这些空日。有没有更简单的方法来编译这个条件聚合?我添加了一个不同的选项,它可能会更好地为您服务。我建议你在表现上比较一下。谢谢,路易斯。我觉得这个术语将我的最终目标与此区分开来。我不是在寻找一个“移动平均线”(过去X天),而是从一个初始的起点,有条件地向前发展。