2014-09-05 1 views
0

계산은 내가 일기 형식의 테이블이 다음 BaseVar 많은 DependVar의의가있는 "한 많은이"형의 관계가그룹 조합하고 그들에게

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 + 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 + value = -1은 29 번 발생했고 VarA + Attr1 + value = 1은 15 번 발생했습니다. VarA + Attr1 + value (VarA + Attr1 + value = -1) = -1이 6 번 발생했습니다. 이 모든 조합을 통해 나갈 때까지 반복됩니다.

+0

내가이 상황에서 그 자체로 어떤 순서로 할 것이 확실하지 오전 – Betlista

+0

... 주문 by' 당신을 위해 좋지 않은 이유를'질문에서 나에게 분명하지 않다? 발생 횟수를 파악하고 적절하게 그룹화해야합니다. – user2924127

+0

'BaseAttrCount()'와'DependAttrCount()'가 어떻게 계산되는지 이해하지 못했습니다. 또한 그것은 (예를 들어 설명에서)'BaseAttr3'이있을 수 있지만 SQL에서는 테이블 구조가 변경되지 않는 것처럼 보입니다 ... – Betlista

답변

0

귀하의 설명을 따르는 데 확신이 없지만 다음 사항이 귀하의 요구 사항을 충족시킬 수 있다고 생각합니다. 이것은 모든 별개의 기본 변수들 * 가능한 모든 값들, 다시 말해 모든 가능한 종속 변수들 * 가능한 값들로 가능한 카티 전 곱을 구축하는 것에 기초한다. 샘플 데이터를 통해 144 개의 서로 다른 조합이 생성됩니다.

일단 존재하면 원본 데이터 (정규화되지 않은 필드로 인해 두 번), 일치하는 기본 변수, 종속 변수 및 기본 값과 종속 값을 다시 왼쪽으로 조인합니다. 여기에서 사례 표현을 사용하여 계산합니다.

샘플 데이터에는 2 쌍의 값 (18 * 2)이있는 18 개의 행이 있으므로 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

관련 문제