我知道这种技巧很棘手,但是我要寻找的是基于TABLE1.code,TABLE1.HOUR,TABLE2.DATA_TYPE,TABLE3.FILE_NAME的缺少值的数量(根本不显示(而不是null)) 。除了夏令时在秋季和春季发生变化外,我们始终希望每天都有24小时。
所以我的表(TABLE1)中有以下几列:VALUE_ID,VALUE,HOUR,CODE,DAY_OF_YEAR
VALUE_ID VALUE HOUR CODE DAY_OF_YEAR
1 7 1-1-2018 01:00 AM HI 0012018
2 9 1-1-2018 03:00 AM HI 0012018
3 22 1-1-2018 04:00 AM HI 0012018
4 55 1-1-2018 05:00 AM HI 0012018
5 99 1-1-2018 06:00 AM HI 0012018
6 77 1-1-2018 07:00 AM HI 0012018
7 33 1-1-2018 08:00 AM HI 0012018
第二个表(TABLE2)中有以下几列:VALUE_ID,FILE_ID,DATA_TYPE
VALUE_ID FILE_ID DATA_TYPE
1 1 REG
2 1 REG
3 1 IRREG
4 1 IRREG
5 1 AB
6 1 AB
7 1 AB
我在第三张表(TABLE3)中具有以下列:FILE_ID,File_Name,FILE_DATE
FILE_ID FILE_NAME FILE_DATE
1 samplefile.csv 10-19-2018
以下是预期结果:
FILE_NAME DATA_TYPE CODE TRUNC(HR) MissingValues#
samplefile.csv REG HI 1-1-2018 22
samplefile.csv IRREG HI 1-1-2018 22
sameplfile.csv AB HI 1-1-2018 21
目标:根据我们当天提交的日期和文件,我们需要查找当天针对该data_type和代码未提交的值数量。
答案 0 :(得分:2)
根据您在注释中所说的,我们可以预期每小时记录一条记录,代码,data_type和file_name。因此,我们交叉连接代码,data_type和file_name,并检查我们实际找到该组合的条目(即小时)。
通过从第二天的午夜中减去当天的午夜并为此使用本地时间戳(即考虑时区)来找出一天中有多少小时。
select
t3.file_name, t2.data_type, t1.code, days.day,
( -- 23, 24, or 25 hours
(to_timestamp_tz(to_char(days.day + 1, 'yyyymmdd'), 'yyyymmdd') -
to_timestamp_tz(to_char(days.day, 'yyyymmdd'), 'yyyymmdd')) * 24
) -
(
select count(*)
from table1 tx1
join table2 tx2 using (value_id)
join table3 tx3 using (file_id)
where tx3.file_name = t3.file_name
and tx2.data_type = t2.data_type
and tx1.code = t1.code
and trunc(tx1.hour) = days.day
) as missing_values
from (select distinct trunc(hour) as day from table1) days
cross join (select distinct code from table1) t1
cross join (select distinct data_type from table2) t2
cross join (select distinct file_name from table3) t3;
此查询包括没有丢失小时数的组合(missing_values = 0)。您当然可以在主查询中包含上述查询,然后消除这些行:
select * from ( above query ) where missing_values > 0;