2016-12-16 14 views
2

我有以下語句以從Teradata DB中的表中提取用戶的日期,小時和數量。 。 。Teradata - 使用extract()函數時如何計算時間戳記中的缺失小時

SELECT 
    CAST(end_time AS DATE) AS end_date, 
    EXTRACT(HOUR FROM end_time) AS end_hour, 
    COUNT(users) AS total_users 
FROM table 
GROUP BY end_date, end_hour 

當使用提取物()函數,我的結果集包含缺失小時那裏是由用戶在24小時內沒有任何活動......我不知道是否有任何技術,以考慮這些失蹤小時我的結果?

我無法創建一個查找表來引用,因爲我沒有必要的權限來創建此數據庫上的表。

任何幫助,將不勝感激!

+0

失蹤的日子呢? –

+0

如果你不能創建一個表,你可以創建一個臨時表:'CREATE VOLATILE TABLE hours(hh BYTEINT UNIQUE NOT NULL)ON COMMITE PRESERVE ROWS',然後插入24行。 – dnoeth

回答

3
  • sys_calendar.calendar產生所要求的日期(根據需要更改範圍)
  • WITH RECURSIVE以生成小時

with  recursive cte_hours (hr) 
      as 
      (
          select 0  from (select 1) t(c) 
       union all select hr + 1 from cte_hours where hr < 23 
      ) 

select  c.calendar_date    as dt 
      ,h.hr      as hr 
      ,zeroifnull(t.total_users) as total_users 

from     sys_calendar.calendar as c 

      cross join cte_hours    as h 

      left join (select  cast(end_time as date)  as end_date 
            ,extract(hour from end_time) as end_hour 
            ,count(users)    as total_users 

         from  mytable t 

         group by end_date 
            ,end_hour 
         ) t 

      on   t.end_date = c.calendar_date 
        and t.end_hour = h.hr 

where  c.calendar_date between current_date - 10 and current_date  

order by dt,hr 
;  

對於@GordonLinoff

select 0 
select 1 
select 0 
union all 
select 1 

[3888]一種選擇用於UNION,相交或MINUS必須引用的表。

select 0 from (select 1 as c) t 
union all 
select 1 from (select 1 as c) t 

select 0 from (select 1) t(c) 
union all 
select 1 from (select 1) t(c) 
+0

非常感謝Dudu,真的很有幫助! – Shaw

+0

當從子查詢中的mytable t中選擇一個額外的列時,查詢會恢復爲遺漏時間......例如,如果我要從mytable中選擇一個額外的列國家......我假設這也是一個空值,有沒有什麼辦法可以在失蹤的時間內包括這個? – Shaw

+0

對不起,但我不明白 –

0

如果你想從數據庫中的所有天的所有時間,那麼你可以使用cross join生成行,然後使用left join的結果帶來:

SELECT d.end_date, 
     EXTRACT(HOUR FROM end_time) AS end_hour, 
     COUNT(t.users) AS total_users 
FROM (select distinct CAST(end_time AS DATE) AS end_date from table) d CROSS JOIN 
    (select distinct EXTRACT(HOUR FROM end_time) AS end_hour from table) h LEFT JOIN 
    table t 
    ON t.end_date = d.end_date and t.end_hour = d.end_hour 
GROUP BY e.end_date, h.end_hour; 

如果不表示所有時間,你可以使用一個明確的清單:

SELECT d.end_date, 
     EXTRACT(HOUR FROM end_time) AS end_hour, 
     COUNT(t.users) AS total_users 
FROM (select distinct CAST(end_time AS DATE) AS end_date from table) d CROSS JOIN 
    (select * from (select 0 as end_hour) t UNION ALL 
     select * from (select 1 as end_hour) t UNION ALL 
     . . . 
    ) h LEFT JOIN 
    table t 
    ON t.end_date = d.end_date and t.end_hour = d.end_hour 
GROUP BY e.end_date, h.end_hour; 
+0

第二個查詢不會在Teradata –

+0

@DuduMarkovitz上運行。 。 。我手邊沒有Teradata。是一個額外的子查詢需要'(select * from(select 0 as end_hour)h union all ...)'? –

+0

查看我的回答(下) –