【发布时间】:2012-01-26 11:35:33
【问题描述】:
我有一个像这样在 Oracle11g 架构中定义的表
Txn_summ_dec
=================
id
currentdate
resource_id
user_id
trans_id
eventdescptn
每个资源都有不同的事件描述。 我给出了一个日期范围(最多 1 个月或更短)和 resource_id,我想获得给定资源 id 的所有用户的不同计数,按 currentdate 分组,eventdescptn
所以我有以下查询
SELECT COUNT(DISTINCT(txn_summ_dec.user_id)) as dusers, currentDate, eventdescptn
FROM Txn_summ_dec
WHERE resource_id = 1
AND currentdate BETWEEN TO_DATE('2011-12-01', 'YYYY-MM-DD')
AND TO_DATE('2011-12-31', 'YYYY-MM-DD')
GROUP BY currentdate, eventdescptn
它正确地给了我下面的结果
dusers currentdate eventdescptn
182 12/01/2011 00:00:00 Save
33 12/04/2011 00:00:00 Save
98 12/01/2011 00:00:00 Read
22 12/30/2011 00:00:00 Write
我想要以下格式的结果:
来自查询
给定的日期范围是假设一个月的 5 号到 5 号(或更少)我想要资源的所有 eventdescptn 范围内的所有日期的结果。 如果该范围内的特定日期没有结果,对于特定事件 descptn,那么它仍应在结果集中具有 'dusers' 值 = 0 的记录
因此,如果一个资源有 3 个不同的 eventdescptns(保存、读取、写入)并且日期范围是一个月的 5 日到 30 日,那么结果集中应该总共有 26X3 = 78 条记录。
我该如何为此编写查询?
另外,我稍后需要将其转换为休眠状态.. 但是从 Sql 开始就可以了
提前致谢
【问题讨论】:
-
将存储的
timestamp列标记为'currentdate' 是错误 的事情 - 它应该被标记为event_occurred(它肯定不再是'current') .您将要创建一个包含描述的event表,并且只存储ID。您将希望按时间戳的 DAY 分组,而不是按(至少)秒精度的东西进行分组。 -
当然,更改列的名称对我来说很好,它只存储日期而不存储时间信息。您还建议使用临时表事件来获取结果吗?如果可以怎么办?
-
不行,不是临时表,创建一个永久的
event表,只在这个汇总表中存储id。此外,您是否确定您的currentdate字段是日期类型 - 您在结果中包含时间 - 无论如何您可能需要时间用于记录目的。此外,范围比较的建议是最小包含,最大排除;所以AND currentDate >= TO_DATE('2011-12-01', 'YYYY-MM-DD') AND currentDate < TO_DATE('2011-12-01', 'YYYY-MM-DD') + INTERVAL 1 MONTH(在这里猜测oracle语法)。