0

我需要列出在所选时间段内(自请求列表之日起)已添加到数据库的 column1 数量 - 每天、每周(过去 7 天)、每月(过去 30 天)和每季度(过去 3 个月) )。例如,下面是我为执行此任务而创建的表。

      Column      |            Type             |                      Modifiers
------------------+-----------------------------+-----------------------------------------------------
column1            character varying (256)        not null default nextval
date               timestamp without time zone    not null default now()
coloumn2           charater varying(256)          ..........

现在,我需要 column1 中相对于所选时间段的条目总数。喜欢,

     Column 1     |            Date             |           Coloumn2
------------------+-----------------------------+-----------------------------------------------------
abcdef              2013-05-12 23:03:22.995562    122345rehr566
njhkepr             2013-04-10 21:03:22.337654    45hgjtron
ffb3a36dce315a7     2013-06-14 07:34:59.477735    jkkionmlopp
abcdefgggg          2013-05-12 23:03:22.788888    22345rehr566

从上面的数据来看,对于每天选择的时间段,它应该是 count= 2

我试过做这个查询

select count(column1) from table1 where date='2012-05-12 23:03:22';

并获得了与时间戳匹配的确切记录。但我真的需要以正确的方式来做,我相信这不是检索计数的有效方法。任何可以帮助我了解编写此类查询的正确有效方式的人都会很棒。我是数据库世界的新手,我正在努力提高编写任何查询的效率。谢谢! [编辑] 当前每个查询都需要 175854 毫秒来处理。什么是减少相应处理时间的有效方法。任何帮助都会非常棒。我正在使用 Postgresql 来做同样的事情。

4

5 回答 5

1

我从你的措辞中理解的是

select date_trunc('day', "date"), count(*)
from t
where "date" >= '2013-01-01'
group by 1
order by 1

根据需要替换'day', 'week', 'month'' quarter'。

http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC

在“日期”列上创建索引。

于 2013-08-21T23:54:51.613 回答
1

如果要计算两个日期之间的记录数:

select count(*)
from Table1
where "Date" >= '2013-05-12' and "Date" < '2013-05-13'
-- count for one day, upper bound not included

select count(*)
from Table1
where "Date" >= '2013-05-12' and "Date" < '2013-06-13'
-- count for one month, upper bound not included

select count(*)
from Table1
where
    "Date" >= current_date and
    "Date" < current_date + interval '1 day'
-- current date
于 2013-08-21T21:54:21.763 回答
1

将另一种选择加入其中...

添加一个类型为“date”的列和索引,在这个例子中命名为“datecol”:

create index on tbl_datecol_idx on tbl (datecol);
analyze tbl;

然后您的查询可以使用相等运算符:

select count(*) from tbl where datecol = current_date - 1; --yesterday

或者,如果您无法添加日期数据类型列,则可以在现有列上创建功能索引:

create index tbl_date_fbi on tbl ( ("date"::DATE) );
analyze tbl;
select count(*) from tbl where "date"::DATE = current_date - 1;

注意1:您不需要直接查询“column1”,因为每一行都填充了该属性,因为NOT NULL.

注意2:创建一个名为“date”的列的形式很糟糕,更糟糕的是它的类型是TIMESTAMP.

于 2013-08-22T00:26:49.370 回答
1
select count(distinct column1) from table1 where date > '2012-05-12 23:03:22';

我假设“column1 的数量”是指“ column1.

编辑: 关于您的第二个问题(查询速度):我假设日期列上的索引应该加快运行时间。根据数据内容,甚至可以声明unique

于 2013-08-21T21:52:13.457 回答
1

为了提高效率,条件应该将 sane 类型的值与被比较的列进行比较。在这种情况下,被比较的列 - Date- 具有 type timestamp,因此我们需要使用一系列tinestamp值。

为了与此保持一致,您应该使用current_timestamp“现在”值,并且正如文档interval所确认的那样,从 a中减去a 会timestamp产生 a timestamp,所以......

最近 1 天:

select count(*) from table1
where "Date" > current_timestamp - interval '1 day'

过去 7 天:

select count(*) from table1
where "Date" > current_timestamp - interval '7 days'

过去 30 天:

select count(*) from table1
where "Date" > current_timestamp - interval '30 days'

最近3个月:

select count(*) from table1
where "Date" > current_timestamp - interval '3 months'

确保您在 Date 列上有一个索引。


如果您发现索引没有被使用,请尝试将条件转换为 between,例如:

where "Date" between current_timestamp - interval '3 months' and current_timestamp

逻辑上相同,但可能有助于优化器选择索引。


请注意,这column1与问题无关;是唯一的,行数不可能与column1任何给定标准找到的不同值的数量不同。

此外,列名的“日期”选择很差,因为 a) 它是保留字,并且 b) 它实际上不是日期。

于 2013-08-22T00:33:02.730 回答