Oracle - 按日期区分组

Posted

技术标签:

【中文标题】Oracle - 按日期区分组【英文标题】:Oracle - Distinct with a Group by date 【发布时间】:2019-10-31 14:34:58 【问题描述】:

我在 Oracle 11g 数据库中有一张这样的表

表记录 REC_ID NUMBER CARD_ID 号码 REC_STATUS NUMBER REC_DATE TIMESTAMP

我想知道在给定时间段内充值了多少张卡,但我希望这些信息按日期分组。 如果一个 card_id 已经在一个日期被计算,那么它不应该被计算在另一个(不同的)。

这里是一些测试数据

和 REC (REC_ID, CARD_ID, REC_STATUS, REC_DATE) 作为 ( select '1', '100', '1', SYSTIMESTAMP - 5 from dual union all select '2', '100', '1', SYSTIMESTAMP - 5 from dual union all select '3', '200', '1', SYSTIMESTAMP - 5 from dual union all select '4', '100', '1', SYSTIMESTAMP - 4 from dual union all select '5', '300', '1', SYSTIMESTAMP - 4 from dual union all select '6', '200', '1', SYSTIMESTAMP - 4 from dual union all 选择 '7', '100', '1', SYSTIMESTAMP - 3 from dual union all 选择 '8', '400', '1', SYSTIMESTAMP - 3 from dual union all 选择 '9', '400', '1', SYSTIMESTAMP - 3 from dual union all 选择 '10', '400', '1', SYSTIMESTAMP - 2 from dual union all select '11', '300', '1', SYSTIMESTAMP - 2 from dual union all select '12', '100', '1', SYSTIMESTAMP - 2 from dual union all 选择'13','400','1',SYSTIMESTAMP - 2 从双 ) -- 测试数据结束

当我执行这样的查询时,我的总数为 4,这是正确的。

选择 COUNT(DISTINCT CARD_ID) COUNT 从录音 其中REC_STATUS = 1

结果

|计数| | 4 |

但是,当我尝试这种方式时,我的总数为 10。 这是因为当我在日期上使用“group by”并在 ID 中使用“distinct”时,区别仅适用于分组日期,而不适用于总期间。

选择 TRUNC(REC_DATE) 日期, COUNT(DISTINCT CARD_ID) COUNT 从录音 其中REC_STATUS = 1 按 T​​RUNC 分组(REC_DATE)

结果

数据 |数数 19 年 6 月 14 日 | 2 19 年 13 月 6 日 | 3 19 年 6 月 15 日 | 3 19 年 12 月 6 日 | 2

我可以做些什么来将不同的应用到期间总计并仍然按日期分组?

【问题讨论】:

抱歉,不清楚。您对上述示例数据的预期输出是什么?什么是“句号”? 【参考方案1】:

也许您只想要每张卡片的最早日期:

SELECT TRUNC(MIN_REC_DATE) as DAT, 
        COUNT(*) as COUNT
FROM (SELECT CARD_ID, MIN(REC_DATE) as MIN_REC_DATE
      FROM REC
      WHERE REC_STATUS = 1 
      GROUP BY CARD_ID
     ) R
GROUP BY TRUNC(MIN_REC_DATE);

【讨论】:

以上是关于Oracle - 按日期区分组的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - 按类别分组,日期范围[重复]

按日期间隔分组 Oracle

Oracle sql查询按日期对连续记录进行分组

Oracle里面如何让一段日期按周、月、季度、年分组显示啊?求高手赐教,贴出正确sql追加高分!

关于一个DB2 按照日期分组的问题求解

SQL:按日期分组并对列中的值求和