2017-04-26 20 views
0

Bowling Chartの基礎としてRedshiftで表を作成しています。Redshift SQL:他の列に基づく行間計算

私はこのフォーマットに私のデータを得た:

data

 
month | product_id | kpi_type | values 
april |  1  | current | 330 
april |  1  | target | 300 
april |  2  | current | 340 
april |  2  | target | 300 
march |  2  | current | 270 
march |  2  | target | 300 

私はdiff = current-target を挿入したいです。

私はこれを取得するために探しています:

 
month | product_id | kpi_type | values 
april |  1  | current | 330 
april |  1  | target | 300 
april |  1  | diff  | 30 
april |  2  | current | 340 
april |  2  | target | 300 
april |  2  | diff  | 40 
march |  2  | current | 270 
march |  2  | target | 300 
march |  2  | diff  | -30 

私はCTEの中で差分を計算して、元のテーブルにそれを合併することにより、そこに取得する方法を知っています。しかし、私はこれを多くの異なるvaluesとより複雑な分散公式で行いたいので、より効率的なソリューションを探しています。

ここで私が得たところです:

 

    select 
     a.month, 
     a.product_id, 
     a.values as current, 
     b.target, 
     a.values - b.target as diff 
    from data a 
    left join 
     (
      select 
      month, 
      product_id, 
      values as target 
      from data 
      where kpi_type = 'target' 
     ) b 
    on md5(a.month || a.product_id) = md5(b.month || b.product_id) 
    where kpi_type = 'current' 
    group by 1,2,3 

そこから私はそれが戻ってdataに労働組合ができ、望ましい結果を得るが、それは効率的では見えません。

Close to this question on SQL Server

+0

"効率的な"ソリューションをお探しの場合は、1ヶ月+製品の組み合わせを1行保存し、現行と目標を(別々の行ではなく)列として保存する必要があります。これにより、レポート作成がはるかに簡単になります。既存の表をこの形式の別の表に変換(ETL)し、新しい表を使用して照会できます。 –

+0

私は私のbiツールに取り込むときに、私は 'kpi_types'を仮想化目的の行として使用する必要があります。私は質問で参照されるリンクと同じフォーマットを取得しようとしています。 – tristangk

答えて

1

kpi_typesの現在とターゲットのproduct_idが1つしかないと仮定すると、diff行を集計してunion allを使用して元の結果と結合することができます。

select month,product_id,kpi_type,values from data 
union all 
select month,product_id,'diff' as kpi_type, 
coalesce(max(case when kpi_type='current' then values end),0) - 
coalesce(max(case when kpi_type='target' then values end),0) as values 
from data 
group by month,product_id 
0

私はコメント機能を使用できませんでした。だから私はここに書きます。私は、赤方偏移でデータを転置するために共用体を使う以外の方法はないと思います。したがって、diffを取得するために、左の結合クエリの代わりに減算にウィンドウ関数を使用することができます。

sum(values) 
    OVER (
     PARTITION BY month, product_id) AS diff 

まず、サブクエリでそのような何かを行う可能性があります:

SELECT 
     CASE WHEN type = 'target' 
     THEN values * -1 
     ELSE values END AS values 
    FROM data 

次にあなたができる労働組合にそれを。

関連する問題