我接触过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。
谢谢。
答案 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