我可以在此处减少SQL查询的数量(PostgreSQL)吗?

时间:2019-02-21 10:26:28

标签: sql postgresql optimization

我接触过SQL已经有一段时间了。 我正在研究一个非常大的数据库。 在一个有大约3000万行的特定表中,我试图找出在一定时期内何时进行了最高数量的输入。一年,直到一个小时的细节级别。

我现在要做的是这样的: 对于2018年:

2018年条目数最高的查找月份(即12个查询):

select count(*) from sing
where to_char(create_time, 'YYYY-MM-DD') like '2018-01-%'

select count(*) from sing
where to_char(create_time, 'YYYY-MM-DD') like '2018-02-%'

找到数量最多的月份后,我必须找到日期(即最多31个查询):

select count(*) from sing
where to_char(create_time, 'YYYY-MM-DD') = '2018-01-01'

select count(*) from sing
where to_char(create_time, 'YYYY-MM-DD') = '2018-01-02'

找到编号最大的日期后,我必须找到小时(即24个查询):

    select count(*) from sing
        where to_char(create_time, 'YYYY-MM-DD HH24:MI:SS') >= '2018-01-02 08:00:00' 
and to_char(create_time, 'YYYY-MM-DD HH24:MI:SS') <= '2018-01-02 08:59:59'

如您所见,这是一项繁琐的任务。所以我的问题是,是否以及如何优化此过程?

该数据库是PostgreSQL,我正在使用pgadmin。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用GROUP BY和date_part函数来简化操作

SELECT date_part('month', create_time), count(*) 
FROM sing
WHERE date_part('year', create_time) = 2018
GROUP BY date_part('month', create_time)

然后是一天

SELECT date_part('day', create_time), count(*) 
FROM sing
WHERE date_part('year', create_time) = 2018
  AND date_part('month', create_time) = <month from previous query>
GROUP BY date_part('day', create_time)

以此类推

答案 1 :(得分:0)

对于2018年将是1个查询:

select count(*) from sing where date_part('year', create_time) = '2018'

所以您可以使用比我认为的to_char更好的date_part

https://www.w3resource.com/PostgreSQL/date_part-function.php