按日期范围进行分组/聚合

3

有一个名为ABC的表,其中只有一列。这一列是日期类型,命名为“created”。因此,样例数值如下:

 created
 2009-06-18 13:56:00
 2009-06-18 12:56:00
 2009-06-17 14:02:00
 2009-06-17 13:12:23
 2009-06-16 10:02:10

我想编写一个查询,使结果为:

count    created
2        2009-06-18
2        2009-06-17
1        2009-06-16

基本上是要计算每个日期有多少条记录,但忽略时间。这是使用Oracle的PL-SQL实现的。您有什么想法吗?

从技术上讲,这个问题中没有任何与PL-SQL特定相关的内容。 - J. Polfer
3个回答

11

TRUNC函数返回DATETIME的DATE。

select trunc(created),count(*) from ABC group by trunc(created)

1
顺便说一句,这个答案适用于ORACLE,但SQL Server没有那个美妙而有用的函数... - tekBlues

2

为了完整起见,我将添加一个适用于任意定义的桶大小的通用变体:

  SELECT trunc( (created - to_date('2000.01.01', 'YYYY.MM.DD'))
                * 24
              ) / 24
         + to_date('2000.01.01', 'YYYY.MM.DD') theDate
       , count(*)
    FROM Layer
GROUP BY trunc( (created - to_date('2000.01.01', 'YYYY.MM.DD'))
                * 24
              ) / 24
         + to_date('2000.01.01', 'YYYY.MM.DD')
ORDER BY 1;

上述查询将按小时给出计数;使用小于24的数字可以得到更大的间隔,或者使用更大的数字创建较小的间隔。通过颠倒*和/的位置,您可以使存储桶以天为增量(例如,使用“ / 7 ”而不是“ * 24 ”将为您提供每周一个存储桶)。


2

选择 count(*),将 created 转换为 'YYYY-MM-DD' 格式,从 ABC 表中分组


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接