2014-09-05 37 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