Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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_Sql Server_Average_Period - Fatal编程技术网

Sql 如何计算一段时间内的平均值?

Sql 如何计算一段时间内的平均值?,sql,sql-server,average,period,Sql,Sql Server,Average,Period,我试图在一段时间内获得平均值(例如:过去6个月、上个月、上周……) 为此,我创建了4个查询。我能清楚地做点什么吗 /** ON SELECTED DATE*/ SELECT AVG(RUN_TIME) FROM (SELECT (DATEDIFF(minute,MIN(CAST(START_DATE AS DATETIME)), MAX(CAST(END_DATE AS DATETIME)))) as RUN_TIME FROM TableTest where DATE_EXPECTED = D

我试图在一段时间内获得平均值(例如:过去6个月、上个月、上周……)

为此,我创建了4个查询。我能清楚地做点什么吗

/** ON SELECTED DATE*/
SELECT AVG(RUN_TIME)
FROM (SELECT (DATEDIFF(minute,MIN(CAST(START_DATE AS DATETIME)), MAX(CAST(END_DATE AS DATETIME)))) as RUN_TIME FROM TableTest where DATE_EXPECTED = DATE_SELECTED ) f

/**ON 6 last month*/
SELECT AVG(RUN_TIME)
FROM (SELECT (DATEDIFF(minute,MIN(CAST(START_DATE AS DATETIME)), MAX(CAST(END_DATE AS DATETIME)))) as RUN_TIME  FROM TableTest 
where Month(CAST(DATE_SELECTED AS DATETIME)) BETWEEN Month(CAST(DATE_SELECTED AS DATETIME) ) AND Month(CAST(DATE_SELECTED AS DATETIME) )+6 ) f

/** on 30 last days */
SELECT AVG(RUN_TIME)
FROM (SELECT (DATEDIFF(minute,MIN(CAST(START_DATE AS DATETIME)), MAX(CAST(END_DATE AS DATETIME)))) as RUN_TIME  FROM TableTest where DATE_EXPECTED between DATE_SELECTED and DATE_SELECTED+30) f

/* on 5 last days */
SELECT AVG(RUN_TIME)
FROM (SELECT (DATEDIFF(minute,MIN(CAST(START_DATE AS DATETIME)), MAX(CAST(END_DATE AS DATETIME)))) as RUN_TIME  FROM TableTest where DATE_EXPECTED between DATE_SELECTED and DATE_SELECTED+5 ) f
这是有效的,但我想知道我是否能以最好的方式做这件事


谢谢,

您可以使用条件聚合:

SELECT AVG(CASE WHEN DATE_EXPECTED = DATE_SELECTED THEN RUN_TIME END) as avg_1,
       AVG(CASE WHEN Month(CAST(DATE_SELECTED AS DATETIME)) BETWEEN Month(CAST(DATE_SELECTED AS DATETIME) ) AND Month(CAST(DATE_SELECTED AS DATETIME) )+6 THEN RUN_TIME END) as avg_2,
       AVG(CASE WHEN DATE_EXPECTED between DATE_SELECTED and DATE_SELECTED+30 THEN RUN_TIME END) as avg_3,
       AVG(CASE WHEN DATE_EXPECTED between DATE_SELECTED and DATE_SELECTED+5 THEN RUN_TIME END) as avg_4
FROM (SELECT (DATEDIFF(minute,MIN(CAST(START_DATE AS DATETIME)), MAX(CAST(END_DATE AS DATETIME)))) as RUN_TIME
      FROM TableTest
     ) f;

您可以使用条件聚合:

SELECT AVG(CASE WHEN DATE_EXPECTED = DATE_SELECTED THEN RUN_TIME END) as avg_1,
       AVG(CASE WHEN Month(CAST(DATE_SELECTED AS DATETIME)) BETWEEN Month(CAST(DATE_SELECTED AS DATETIME) ) AND Month(CAST(DATE_SELECTED AS DATETIME) )+6 THEN RUN_TIME END) as avg_2,
       AVG(CASE WHEN DATE_EXPECTED between DATE_SELECTED and DATE_SELECTED+30 THEN RUN_TIME END) as avg_3,
       AVG(CASE WHEN DATE_EXPECTED between DATE_SELECTED and DATE_SELECTED+5 THEN RUN_TIME END) as avg_4
FROM (SELECT (DATEDIFF(minute,MIN(CAST(START_DATE AS DATETIME)), MAX(CAST(END_DATE AS DATETIME)))) as RUN_TIME
      FROM TableTest
     ) f;

是的,我想要一个平均值。我仍然在学习:我不应该使用平均值?你应该看看这篇关于使用日期快捷方式的文章。是的,我想要一个平均值。我仍然在学习:我不应该使用平均值?你应该看看这篇关于使用日期快捷方式的文章。我的不同查询的结果不同。我对所有的平均值都有相同的结果(而且不应该)@FannyV。对于这四个
avg()
调用,数据必须非常特殊,才能返回相同的值。我对所有的平均值都有相同的结果(而且不应该)@FannyV。对于这四个
avg()
调用,要返回相同的值,数据必须非常特殊。