2014-09-05 78 views
0

我有一個天氣類型表:組組合和盡數

BaseVar | BaseDate | BaseAttr1 | BaseAttr2 | DependVar | DependDate | DependAttr1 | DependAttr2 | 

VarA  01/01  -1   -1  VarA  01/01   -1   -1  
VarA  01/01  -1   -1  VarB  01/01   1   1 
VarA  01/01  -1   -1  VarC  01/01   -1   -1 
VarB  01/01  1   1  VarA  01/01   -1   -1  
VarB  01/01  1   1  VarB  01/01   1   1 
VarB  01/01  1   1  VarC  01/01   -1   -1 
VarC  01/01  -1   -1  VarA  01/01   -1   -1  
VarC  01/01  -1   -1  VarB  01/01   1   1 
VarC  01/01  -1   -1  VarC  01/01   -1   -1 

VarA  01/02  -1   1  VarA  01/02  -1   1  
VarA  01/02  -1   1  VarB  01/02  -1   -1 
VarA  01/02  -1   1  VarC  01/02  -1   -1 
VarB  01/02  -1   -1  VarA  01/02  -1   1  
VarB  01/02  -1   -1  VarB  01/02  -1   -1 
VarB  01/02  -1   -1  VarC  01/02  -1   -1 
VarC  01/02  -1   -1  VarA  01/02  -1   1  
VarC  01/02  -1   -1  VarB  01/02  -1   -1 
VarC  01/02  -1   -1  VarC  01/02  -1   -1 

. 
. 
. 
. 
. 
All the way to 12/30 

還有一種情況BaseVar有許多DependVar的一個「1對多」的關係。我的目標是當'BaseVar + WhichBaseAttr + VaseValue'組合出現時,計算出現的每個'DependAttr1 + WhichDependAttr + DependantValue'組合。最後統計他們,以便我可以看到何時發生這種組合......這些組合也會發生這麼多次。因此,在給定的一天中,所有變量(VarA,VarB,VarC)都會在它們的Attr1和Attr2列(值可以是1或-1)中分別收到一個值。我已經提供了部分結果(因爲組合太多),以便更好地瞭解我想要完成的工作。我想將我的數據從第一個表格轉換爲下表。我嘗試了不同的分組,但無法使其工作。

BaseVar | WhichBaseAttr| BaseValue| BaseAttrCount() | DependVar | WhichDependAttr | DependantValue| DependAttrCount()| 
VarA  BaseAttr1  1  0    VarA   DependAttr1   1    0 
VarA  BaseAttr1  1  0    VarA   DependAttr1   -1    0 
VarA  BaseAttr1  -1  2    VarA   DependAttr1   1    0 
VarA  BaseAttr1  -1  2    VarA   DependAttr1   -1    2 

VarA  BaseAttr2  1  1    VarA   DependAttr1   1    1 
VarA  BaseAttr2  1  1    VarA   DependAttr1   -1    0 
VarA  BaseAttr2  -1  1    VarA   DependAttr1   1    0 
VarA  BaseAttr2  -1  1    VarA   DependAttr1   -1    1 

VarA  BaseAttr2  1  1    VarA   DependAttr2   1    1 
VarA  BaseAttr2  1  1    VarA   DependAttr2   -1    0 
VarA  BaseAttr2  -1  1    VarA   DependAttr2   1    0 
VarA  BaseAttr2  -1  1    VarA   DependAttr2   -1    1 

VarA  BaseAttr1  1  0    VarA   DependAttr2   1    0 
VarA  BaseAttr1  1  0    VarA   DependAttr2   -1    0 
VarA  BaseAttr1  -1  2    VarA   DependAttr2   1    1 
VarA  BaseAttr1  -1  2    VarA   DependAttr2   -1    1 

(Next seqeuence would be :) 

VarA             VarB 

After all those are done: 

VarA             VarC 

Then: 

VarB             VarA 

and so on until it would reach: 

VarC             VarC 

實質上,對於baseVar + baseAttr + baseVal的每個組合,我試圖計算每隔一個組合發生的次數。例如(與我的表格無關,只是一個單獨的例子):VarB + Attr2 +值= -1發生了29次,當它發生29次時,VarA + Attr1 +值= 1發生了15次,VarA + Attr1 +值= -1發生了6次,以此類推。這會重複,直到我經歷了所有的組合。

+0

這不是很清楚,我的問題,爲什麼'爲了by'是對你不好...... – Betlista 2014-09-05 17:24:08

+0

我不知道由什麼順序將通過自身在這種情況下怎麼辦?我需要對事件進行計數並將其恰當地分組。 – user2924127 2014-09-05 17:32:27

+0

我不明白如何計算'BaseAttrCount()'和'DependAttrCount()'。另外,似乎可以有'BaseAttr3'(例如從你的描述中),但是在SQL中,表格結構並沒有改變... – Betlista 2014-09-05 18:05:21

回答

0

儘管我沒有完全相信我遵循你的解釋,我認爲以下可能會滿足你的要求。它基於建立所有不同基礎變量*的笛卡爾乘積*可能的值,然後再次與所有不同的因變量*可能的值。從您的樣本數據中可以得出144個不同的組合。

一旦存在,左連接回源數據(兩次歸因於非規範化字段),匹配基本變量,因變量以及基本值和相關值。從那裏我們可以使用案例表達。

請注意,您的示例數據有18行,包含2對值(18 * 2),因此BaseAttrCount和DependAttrCount的計數均爲36。

select 
     bvar.BaseVar 
    , bvar.WhichBaseAttr 
    , bval.BaseValue 
    , count(case when bvar.WhichBaseAttr = 'BaseAttr1' then bd1.BaseAttr1 
       when bvar.WhichBaseAttr = 'BaseAttr2' then bd1.BaseAttr2 
      end) 
    + count(case when bvar.WhichBaseAttr = 'BaseAttr1' then bd2.BaseAttr1 
       when bvar.WhichBaseAttr = 'BaseAttr2' then bd2.BaseAttr2 
      end) as BaseAttrCount 
    , dvar.DependVar 
    , dvar.WhichDependAttr 
    , dval.DependantValue 
    , count(case when dvar.WhichDependAttr = 'DependAttr1' then bd1.DependAttr1 
       when dvar.WhichDependAttr = 'DependAttr2' then bd1.DependAttr2 
      end) 
    + count(case when dvar.WhichDependAttr = 'DependAttr1' then bd2.DependAttr1 
       when dvar.WhichDependAttr = 'DependAttr2' then bd2.DependAttr2 
      end) as DependAttrCount 
from (
     select distinct 
      BaseVar 
      , 'BaseAttr1' as WhichBaseAttr 
     from Weather 
     UNION ALL 
     select distinct 
      BaseVar 
      , 'BaseAttr2' 
     from Weather 
    ) as bvar 
cross join (
      select -1 as BaseValue UNION ALL select 1 
      ) as bval 
cross join(
      select distinct 
       DependVar 
       , 'DependAttr1' as WhichDependAttr 
      from Weather 
      UNION ALL 
      select distinct 
       DependVar 
       , 'DependAttr2' 
      from Weather 
     ) as dvar 
cross join (
      select -1 as DependantValue UNION ALL select 1 
      ) as dval 
left join weather as bd1 on bvar.basevar   = bd1.basevar 
         and bvar.WhichBaseAttr = 'BaseAttr1' 
         and bval.BaseValue  = bd1.BaseAttr1 
         and dvar.DependVar  = bd1.DependVar 
         and dvar.WhichDependAttr = 'DependAttr1' 
         and dval.DependantValue = bd1.DependAttr1 
left join weather as bd2 on bvar.basevar   = bd2.basevar 
         and bvar.WhichBaseAttr = 'BaseAttr2' 
         and bval.BaseValue  = bd2.BaseAttr2 
         and dvar.DependVar  = bd2.DependVar 
         and dvar.WhichDependAttr = 'DependAttr2' 
         and dval.DependantValue = bd2.DependAttr2 
group by 
     bvar.BaseVar 
    , bvar.WhichBaseAttr 
    , bval.BaseValue 
    , dvar.DependVar 
    , dvar.WhichDependAttr 
    , dval.DependantValue 
order by 
     bvar.BaseVar 
    , bvar.WhichBaseAttr 
    , bval.BaseValue 
    , dvar.DependVar 
    , dvar.WhichDependAttr 
    , dval.DependantValue 
; 

See this SQLfiddle demo