2015-09-30 43 views
0

首先:請原諒我的英語不好。 Iam不是英語母語人士。 ;)我盡力做到最好。Oracle SQL - 映射表到「時間柵格」

我在oracle11下有一個sql問題。

這是我的表數據:(例如)

------------------------------------------------------- 
    | company |  datetime  | user | actions | 
    ------------------------------------------------------- 
    | 1000 | 2015-09-10 00:00:00 | userA | 32  | 
    | 1000 | 2015-09-10 00:00:00 | userB | 12  | 
    | 1000 | 2015-09-10 00:00:00 | userC | 45  | 

    | 1001 | 2015-09-10 00:00:00 | userA | 64  | 
    | 1001 | 2015-09-10 00:00:00 | userB | 35  | 
    | 1001 | 2015-09-10 00:00:00 | userC | 78  | 

    | 1000 | 2015-09-10 00:06:00 | userA | 63  | 
    | 1000 | 2015-09-10 00:06:00 | userC | 24  | 

    | 1000 | 2015-09-10 00:12:00 | userA | 13  | 
    | 1000 | 2015-09-10 00:12:00 | userB | 33  |  
    | 1000 | 2015-09-10 00:12:00 | userC | 83  | 

    | 1000 | 2015-09-10 00:18:00 | userC | 35  | 
    | 1000 | 2015-09-10 00:18:00 | userD | 56  | 
    ------------------------------------------------------- 

你看,還有與用戶和操作不同的時間。

我想現在做一個查詢,這是給我一個「每個用戶和時間」的記錄... 我想映射它或多或少的一個「timeraster」..構建由datetime列這張桌子。即使對於沒有在特定時間進入的用戶也是如此。

i.E.爲公司「1000」

------------------------------------------------------- 
    | company |  datetime  | user | actions | 
    ------------------------------------------------------- 
    | 1000 | 2015-09-10 00:00:00 | userA | 32  | 
    | 1000 | 2015-09-10 00:00:00 | userB | 12  | 
    | 1000 | 2015-09-10 00:00:00 | userC | 45  | 
    | 1000 | 2015-09-10 00:00:00 | userD | 0  | 

    | 1000 | 2015-09-10 00:06:00 | userA | 63  | 
    | 1000 | 2015-09-10 00:06:00 | userB | 0  | 
    | 1000 | 2015-09-10 00:06:00 | userC | 24  | 
    | 1000 | 2015-09-10 00:06:00 | userD | 0  | 

    | 1000 | 2015-09-10 00:12:00 | userA | 0  | 
    | 1000 | 2015-09-10 00:12:00 | userB | 0  | 
    | 1000 | 2015-09-10 00:12:00 | userC | 83  | 
    | 1000 | 2015-09-10 00:12:00 | userD | 0  | 
    ------------------------------------------------------- 

用戶的金額不同公司的用於...

(主要和4之間25)..我與樞軸表試過媒體鏈接。但我認爲應該通過一個更簡單的方式來實現這一目標嗎?

回答

0

Partitioned outer join來救援!

with sample_data as (select 1000 company, to_date('10/09/2015 00:00:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userA' usr, 32 actions from dual union all 
        select 1000 company, to_date('10/09/2015 00:00:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userB' usr, 22 actions from dual union all 
        select 1000 company, to_date('10/09/2015 00:00:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userC' usr, 45 actions from dual union all 
        select 1001 company, to_date('10/09/2015 00:00:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userA' usr, 64 actions from dual union all 
        select 1001 company, to_date('10/09/2015 00:00:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userB' usr, 35 actions from dual union all 
        select 1001 company, to_date('10/09/2015 00:00:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userC' usr, 78 actions from dual union all 
        select 1000 company, to_date('10/09/2015 00:06:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userA' usr, 63 actions from dual union all 
        select 1000 company, to_date('10/09/2015 00:06:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userC' usr, 24 actions from dual union all 
        select 1000 company, to_date('10/09/2015 00:12:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userA' usr, 13 actions from dual union all 
        select 1000 company, to_date('10/09/2015 00:12:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userB' usr, 33 actions from dual union all 
        select 1000 company, to_date('10/09/2015 00:12:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userC' usr, 83 actions from dual union all 
        select 1000 company, to_date('10/09/2015 00:18:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userC' usr, 35 actions from dual union all 
        select 1000 company, to_date('10/09/2015 00:18:00', 'dd/mm/yyyy hh24:mi:ss') datetime, 'userD' usr, 56 actions from dual), 
      dates as (select distinct company, datetime from sample_data) 
select sd.company, 
     dts.datetime, 
     sd.usr, 
     nvl(sd.actions, 0) actions 
from dates dts 
     left outer join sample_data sd partition by (sd.usr, sd.company) on (dts.datetime = sd.datetime) 
where dts.company = sd.company 
order by 1, 2, 3; 

    COMPANY DATETIME    USR  ACTIONS 
---------- --------------------- ----- ---------- 
     1000 10/09/2015 00:00:00 userA   32 
     1000 10/09/2015 00:00:00 userB   22 
     1000 10/09/2015 00:00:00 userC   45 
     1000 10/09/2015 00:00:00 userD   0 
     1000 10/09/2015 00:06:00 userA   63 
     1000 10/09/2015 00:06:00 userB   0 
     1000 10/09/2015 00:06:00 userC   24 
     1000 10/09/2015 00:06:00 userD   0 
     1000 10/09/2015 00:12:00 userA   13 
     1000 10/09/2015 00:12:00 userB   33 
     1000 10/09/2015 00:12:00 userC   83 
     1000 10/09/2015 00:12:00 userD   0 
     1000 10/09/2015 00:18:00 userA   0 
     1000 10/09/2015 00:18:00 userB   0 
     1000 10/09/2015 00:18:00 userC   35 
     1000 10/09/2015 00:18:00 userD   56 
     1001 10/09/2015 00:00:00 userA   64 
     1001 10/09/2015 00:00:00 userB   35 
     1001 10/09/2015 00:00:00 userC   78 
+0

千謝謝!那很完美! :) – theMightyDafa