如何在Oracle中显示“丢失”小时数

时间:2018-10-19 14:43:34

标签: sql oracle

我知道这种技巧很棘手,但是我要寻找的是基于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和代码未提交的值数量。

1 个答案:

答案 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;