Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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_Postgresql_Group By_Aggregate - Fatal编程技术网

Sql 按小时分组,总平均值

Sql 按小时分组,总平均值,sql,postgresql,group-by,aggregate,Sql,Postgresql,Group By,Aggregate,我有一个包含作业历史记录的PostgreSQL表: CREATE TABLE jobHistory ( jobid int4, starttime timestamptz, endtime timestamptz ); 我试图创建一个SQL查询,以显示每小时运行的作业的平均数量。应该有24行(0-23表示24小时),以包含该小时运行的平均作业数 myjobHistory表中的行总数约为20k。以下是一个示例: jobid startTime

我有一个包含作业历史记录的PostgreSQL表:

CREATE TABLE jobHistory
(
   jobid int4,
   starttime timestamptz,
   endtime timestamptz
);
我试图创建一个SQL查询,以显示每小时运行的作业的平均数量。应该有24行(0-23表示24小时),以包含该小时运行的平均作业数

my
jobHistory
表中的行总数约为20k。以下是一个示例:

jobid  startTime                 endTime
------------------------------------------------------
377    2017-11-02 15:43:43.0     2017-11-02 15:49:22.0
114    2017-11-02 15:47:05.0     2017-11-02 15:56:19.0
378    2017-11-02 15:49:22.0     2017-11-02 15:53:01.0
379    2017-11-02 15:53:01.0     2017-11-02 16:33:16.0
380    2017-11-02 16:33:16.0     2017-11-02 16:51:26.0
381    2017-11-02 16:51:26.0     2017-11-02 17:03:00.0
382    2017-11-02 17:03:00.0     2017-11-02 17:11:59.0
383    2017-11-02 17:11:59.0     2017-11-02 17:12:44.0
384    2017-11-02 17:12:43.0     2017-11-02 17:13:36.0
385    2017-11-02 17:13:36.0     2017-11-02 17:14:20.0
386    2017-11-02 17:14:20.0     2017-11-02 17:15:08.0
387    2017-11-02 17:15:08.0     2017-11-02 17:16:03.0
388    2017-11-02 17:16:03.0     2017-11-02 18:31:01.0
150    2017-11-02 17:55:00.0     2017-11-02 18:16:32.0
153    2017-11-02 17:55:00.0     2017-11-02 18:15:28.0
135    2017-11-02 17:55:00.0     2017-11-02 17:55:01.0
132    2017-11-02 17:55:00.0     2017-11-02 18:13:00.0
156    2017-11-02 17:55:00.0     2017-11-02 17:55:06.0
147    2017-11-02 17:55:00.0     2017-11-02 17:57:47.0
138    2017-11-02 17:55:00.0     2017-11-02 18:12:33.0
140    2017-11-02 17:55:00.0     2017-11-02 17:55:17.0
389    2017-11-02 18:31:01.0     2017-11-02 18:38:11.0
390    2017-11-02 18:38:11.0     2017-11-02 18:38:35.0
391    2017-11-02 18:38:35.0     2017-11-02 18:38:39.0

我在找平均每小时的工作。作业每天24小时、全天运行。有些时间的作业比其他时间多。总共大约有120个工作岗位。有些需要几分钟,有些需要几个小时。为了保持负载平衡,当我安排新工作时,我想看看平均哪一小时的工作最少。

你的问题不清楚

我假设您正在查找基于列
starttime
每小时运行的作业总数,因此下面是查询

SELECT count(jobid) AS TotalJobs,
       date_trunc('hour', starttime) AS Date_Hour
FROM jobHistory
GROUP BY date_trunc('hour', starttime)
order by Date_Hour;
如果您在
endTime
的基础上需要它,您可以将上面的查询替换为
starttime
endTime

结果:

totaljobs   date_hour
-------------------------------
4           02.11.2017 15:00:00
2           02.11.2017 16:00:00
15          02.11.2017 17:00:00
3           02.11.2017 18:00:00
希望这会有所帮助


你的问题不清楚

我假设您正在查找基于列
starttime
每小时运行的作业总数,因此下面是查询

SELECT count(jobid) AS TotalJobs,
       date_trunc('hour', starttime) AS Date_Hour
FROM jobHistory
GROUP BY date_trunc('hour', starttime)
order by Date_Hour;
如果您在
endTime
的基础上需要它,您可以将上面的查询替换为
starttime
endTime

结果:

totaljobs   date_hour
-------------------------------
4           02.11.2017 15:00:00
2           02.11.2017 16:00:00
15          02.11.2017 17:00:00
3           02.11.2017 18:00:00
希望这会有所帮助


感谢所有看过这篇文章的人。我确信有一种方法可以使用纯SQL获得答案,但我就是想不出来。为了回答我的问题,我编写了一个perl脚本来获得结果

下面是它的工作原理

1.)获取最早的工作记录和最新的工作记录之间的天数,这将用于平均每小时0-23的每次发生的工作数。
2.)对于每个作业记录,在作业运行的当天每小时递增一个计数器。例如,如果作业从下午2点到6点运行,脚本将为2、3、4、5和6小时增加一个计数器。如果作业时间超过23小时,我只会将值0-23增加一次。此时,我得到了一个有两列的结果。第一列是小时(0-23),第二列是在该小时内运行的作业的出现次数。
3.)然后,我的脚本从上面的步骤2中获取数字,并将其除以天数以生成平均值。

因为我已经编写了一个perl脚本来生成结果,所以现在我知道安排新作业的最佳时间是上午11点。

如果有人对处理SQL感兴趣,我想看看它是如何完成的。现在,我将把我的perl脚本放在手边。

以下是指向完整工作历史数据的链接:

下面是我的perl脚本的输出,它计算每小时运行的作业的平均数量:

0=2.49
1=2.10
2=2.16
3=2.02
4=4.10
5=2.86
6=2.00
7=1.69
8=1.69
9=1.80
10=1.67
11=1.53
12=1.76
13=1.73
14=8.33
15=2.24
16=1.63
17=8.67
18=6.12
19=5.00
20=4.84
21=3.76
22=10.43

23=4.37

感谢所有看过这篇文章的人。我确信有一种方法可以使用纯SQL获得答案,但我就是想不出来。为了回答我的问题,我编写了一个perl脚本来获得结果

下面是它的工作原理

1.)获取最早的工作记录和最新的工作记录之间的天数,这将用于平均每小时0-23的每次发生的工作数。
2.)对于每个作业记录,在作业运行的当天每小时递增一个计数器。例如,如果作业从下午2点到6点运行,脚本将为2、3、4、5和6小时增加一个计数器。如果作业时间超过23小时,我只会将值0-23增加一次。此时,我得到了一个有两列的结果。第一列是小时(0-23),第二列是在该小时内运行的作业的出现次数。
3.)然后,我的脚本从上面的步骤2中获取数字,并将其除以天数以生成平均值。

因为我已经编写了一个perl脚本来生成结果,所以现在我知道安排新作业的最佳时间是上午11点。

如果有人对处理SQL感兴趣,我想看看它是如何完成的。现在,我将把我的perl脚本放在手边。

以下是指向完整工作历史数据的链接:

下面是我的perl脚本的输出,它计算每小时运行的作业的平均数量:

0=2.49
1=2.10
2=2.16
3=2.02
4=4.10
5=2.86
6=2.00
7=1.69
8=1.69
9=1.80
10=1.67
11=1.53
12=1.76
13=1.73
14=8.33
15=2.24
16=1.63
17=8.67
18=6.12
19=5.00
20=4.84
21=3.76
22=10.43

23=4.37

你需要考虑<代码>开始时间<代码>还是<代码>结束时间< /代码>?在某些情况下,它们是不同的。您所说的

该小时运行的平均作业数是什么意思?这不是该小时运行的作业总数吗?如果不是,你的逻辑是什么?<代码>平均作业< /代码>?你需要考虑<代码>开始时间<代码>还是<代码>结束时间< /代码>?在某些情况下,它们是不同的。您所说的
该小时运行的平均作业数是什么意思?这不是该小时运行的作业总数吗?如果不是,那么您对
平均作业的逻辑是什么?
?这是一个很棒的zarruq,但是您的SQL为每天的每小时生成一行。我正在寻找的结果在输出中只有12行,一天中每小时1行。这个