Sql 按小时分组,总平均值
我有一个包含作业历史记录的PostgreSQL表: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
CREATE TABLE jobHistory
(
jobid int4,
starttime timestamptz,
endtime timestamptz
);
我试图创建一个SQL查询,以显示每小时运行的作业的平均数量。应该有24行(0-23表示24小时),以包含该小时运行的平均作业数
myjobHistory
表中的行总数约为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行。这个