Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/vb6/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
如何计算值的平均值而不包括最后一个值(sql)?_Sql_Tsql_Window Functions - Fatal编程技术网

如何计算值的平均值而不包括最后一个值(sql)?

如何计算值的平均值而不包括最后一个值(sql)?,sql,tsql,window-functions,Sql,Tsql,Window Functions,我有一张桌子。我按id对其进行分区,并希望计算当前值之前的值的平均值,而不包括当前值。下面是一个示例表: +----+-------+------------+ | id | Value | Date | +----+-------+------------+ | 1 | 51 | 2020-11-26 | | 1 | 45 | 2020-11-25 | | 1 | 47 | 2020-11-24 | | 2 | 32 | 2020-11-26 | |

我有一张桌子。我按id对其进行分区,并希望计算当前值之前的值的平均值,而不包括当前值。下面是一个示例表:

+----+-------+------------+
| id | Value |    Date    |
+----+-------+------------+
|  1 |    51 | 2020-11-26 |
|  1 |    45 | 2020-11-25 |
|  1 |    47 | 2020-11-24 |
|  2 |    32 | 2020-11-26 |
|  2 |    51 | 2020-11-25 |
|  2 |    45 | 2020-11-24 |
|  3 |    47 | 2020-11-26 |
|  3 |    32 | 2020-11-25 |
|  3 |    35 | 2020-11-24 |
+----+-------+------------+
在这种情况下,它意味着计算2020年11月26日之前日期的平均值。这是预期的结果

+----+-------+
| id | Value |
+----+-------+
|  1 |    46 |
|  2 |    48 |
|  3 |  33.5 |
+----+-------+
我已经使用N行previous计算了它,但这样看来,我平均N行previous+最后一行,并且我想排除最后一行,这是我的案例中最近的日期。 我的问题是:

SELECT ID, 
  (avg(Value) OVER(
      PARTITION BY ID
      ORDER BY Date
      ROWS 9 PRECEDING )) as avg9
FROM t1
为什么不直接过滤:

select id, avg(value)
from t1
where date < '2020-11-26'
group by id;
如果希望日期灵活,请说出每个日期的最新值,然后:

select id, avg(value)
from (select t1.*,
             max(date) over (partition by id) as max_date
      from t1
     ) t1
where date < max_date
group by id;
为什么不直接过滤:

select id, avg(value)
from t1
where date < '2020-11-26'
group by id;
如果希望日期灵活,请说出每个日期的最新值,然后:

select id, avg(value)
from (select t1.*,
             max(date) over (partition by id) as max_date
      from t1
     ) t1
where date < max_date
group by id;

然后使用“开始”和“结束”之间的值来完整定义窗口:


然后使用“开始”和“结束”之间的值来完整定义窗口:


按[Date]DESC按id顺序在分区上做一个行号。这将给最新日期的行一个秩=1。将其包装在CTE中,然后计算秩>1的每个分区的平均值。请检查语法

;with a as
(
select id, value, Date, row_number() over (partition by id order by date 
desc) as RN
)
select id, avg(Value) from a group by id where r.RN > 1 

按[Date]DESC按id顺序在分区上做一个行号。这将给最新日期的行一个秩=1。将其包装在CTE中,然后计算秩>1的每个分区的平均值。请检查语法

;with a as
(
select id, value, Date, row_number() over (partition by id order by date 
desc) as RN
)
select id, avg(Value) from a group by id where r.RN > 1 

这再简单不过了。。。在最后的30分钟里我一直很痛苦。。非常感谢。这再简单不过了。。。在最后的30分钟里我一直很痛苦。。非常感谢。