我为Oracle数据库编写了一个脚本,该脚本使用多种技术记录事件。事件通常记录两次,一次是在技术进入时,有一次是在技术发布时。
我想要做的是展示我的数据库中的每项技术。 从每种技术我想要显示当前有多少项目以及最旧项目的年龄。
我的表格应如何显示的图形示例:
我使用以下代码来计算这些东西
select dm1.technology,
count(dm1.id) as "current_number_of_items",
TO_CHAR(MAX(TO_DATE('20000101','yyyymmdd')+(SYSDATE - dm1.time_event)),
'hh24:mi:ss') as "age_of_oldest_item"
from dm_procmon dm1
where (select count(dm2.id) from dm_procmon dm2 where dm1.id= dm2.id) = 1
group by dm1.technology;
为了计算当前的项目数量,我只计算id并按技术对它们进行分组。为了计算最旧项目的年龄,我检查一个id是否只在数据库中出现一次(否则它已经出来)。我只是采取最大的年龄(SYS - 来自日志的时间事件)。
这种方法很完美,但在技术中有0项时则不然。如果没有项目,我还想显示技术名称。我怎么能这样做?
答案 0 :(得分:1)
我这样理解你:如果项目中相同的ID出现在表格中两次(或更多),则不应对其进行分析, 但即使不存在只出现一次的项目,您也希望列出此技术。此查询应执行此操作:
with items as (
select id, technology, count(1) cnt, max(time_event) tev
from dm_procmon group by id, technology )
select technology, sum(decode(cnt, 1, 1, 0)) as "current_number_of_items",
TO_CHAR(MAX(TO_DATE('20000101','yyyymmdd')
+(SYSDATE - decode(cnt, 1, tev))), 'hh24:mi:ss') as "age_of_oldest_item"
from items group by technology order by technology
子查询items
计算每个项目的外观。主查询列出所有技术并添加信息
对于count = 1的项(函数decode()
执行此操作)。
示例结果:
TECHNOLOGY current_number_of_items age_of_oldest_item
---------------------- ----------------------- ------------------
Folder Belfius 1 00:36:35
Folder KBC 0
Queue KBC 1 00:36:35
Repository Accepted 1 00:36:35
Repository Enriched 1 00:36:35
Repository Sent 2 00:36:35