2016-10-17 15 views
2

私は、毎週バージョンタイプで自分のデータに表示される個別のIDを数えようとしており、クエリを正しく構築する方法がわかりません。グループ化された時間以上のケースでカウントする

私はの線に沿ってテーブルを生成するために願っています:私は、以下のクエリを作り上げる試みた

 1.1  1.2  1.3 1.4 
wk1  1  5  4  8 
wk2  4  3  9  8 
wk3  1  8  0  6 

が、それはどのその後、によって、グループ内のCaseステートメントを必要として、それは実行されませんcount()を受け付けません。

SELECT 
    Case when version like "1.1%" then Count(distinct ID) 
    when version like "1.2%" then Count(distinct ID) 
    when version like "1.3%" then Count(distinct ID) 
    when version like "1.4%" then Count(distinct ID) end, 
    CAST(((datediff(timestamp_pst,'2016-01-03')/7)+1) as INT) as week_of_the_year 
    FROM db.table 
    where timestamp_pst >= "2016-01-28" 
    group by CAST(((datediff(timestamp_pst,'2016-01-03')/7)+1) as INT) 
     order by week_of_the_year 
+1

あなたは 'SUM(CASE WHEN ... THEN 1 ELSE 0 END)x ...'のようなものを望んでいません(アプリケーションコードでこの種のことを処理しますが)。 – Strawberry

+0

@Strawberry - これを実行します列リストが固定されていてもアプリ側 –

+0

@Strawberry IDが繰り返されるIDが繰り返される場合、COUNT(DISTINCT)はSUMと同じ結果を得られません(COUNT()と同等です)。 – Matt

答えて

1
SELECT 
    COUNT(DISTINCT (CASE WHEN version like '1.1%' THEN ID END)) as '1.1' 
    ,COUNT(DISTINCT (CASE WHEN version like '1.2%' THEN ID END)) as '1.2' 
    ,COUNT(DISTINCT (CASE WHEN version like '1.3%' THEN ID END)) as '1.3' 
    ,COUNT(DISTINCT (CASE WHEN version like '1.4%' THEN ID END)) as '1.4' 
    CAST(((datediff(timestamp_pst,'2016-01-03')/7)+1) as INT) as week_of_the_year 
    FROM aws_d3.iaanalytics_detail 
    where timestamp_pst >= "2016-01-28" 
    group by CAST(((datediff(timestamp_pst,'2016-01-03')/7)+1) as INT) 
     order by week_of_the_year 

を試してみてください。 case文が実際に集約関数の中に入るようにしてください。 COUNT(DISTINCT)にしたいと思っているので、実際に集計のDISTINCTキーワードを利用するか、派生テーブルを作成して別の回答が示唆するように異なる値だけが存在するようにする必要がありますが、唯一の単語として繰り返さないようにしますDISTINCT派生テーブルを使用して問題を複雑にする必要はありません。

SUM(CASE WHEN blah THEN 1 ELSE 0 END)は、すべての出現を合計し、別個の値を数えないので、あなたのために働くことに注意してください。また、集計関数はNULL値を無視し、ELSEステートメントを含まない場合、ケース式の値の値は、一致しない場合はNULLになります。

+0

これは完全に機能しました。私はHiveで働いていて、 '1.1'として好きではありませんでしたが、それ以外は完璧でした。 –

0

あなたは条件CASE文でCOUNT()集約関数を使用することができます。

SELECT 
    week_of_the_year 
    , COUNT(CASE WHEN version LIKE '1.1%' THEN id END) AS v1_1 
    , COUNT(CASE WHEN version LIKE '1.2%' THEN id END) AS v1_2 
    , COUNT(CASE WHEN version LIKE '1.3%' THEN id END) AS v1_3 
    , COUNT(CASE WHEN version LIKE '1.4%' THEN id END) AS v1_4 
FROM (
    SELECT 
    DISTINCT 
     id 
    , version 
    , CAST(((datediff(timestamp_pst,'2016-01-03')/7)+1) as INT) as week_of_the_year 
    FROM aws_d3.iaanalytics_detail 
    where timestamp_pst >= '2016-01-28' 
) t 
GROUP BY week_of_the_year 
ORDER BY week_of_the_year 

クエリのDISTINCT一部が派生テーブルt内で行われることに注意してください。実際には派生テーブルは必要ありませんが、GROUP BY句は同じコードを繰り返して読みやすくするため、より洗練されたソリューションです。これはまた、集約内で行われるべきではない別個の部分を導入する。

0

はあなたが"条件付き集計"を使用することを望んでいるこの1

SELECT 
    SUM(Case when version like "1.1%" then 1 ELSE 0 END) as '1.1', 
    SUM(Case when version like "1.2%" then 1 ELSE 0 END) as '1.2', 
    SUM(Case when version like "1.3%" then 1 ELSE 0 END) as '1.3', 
    SUM(Case when version like "1.4%" then 1 ELSE 0 END) as '1.4', 
    CAST(((datediff(timestamp_pst,'2016-01-03')/7)+1) as INT) as week_of_the_year 
    FROM aws_d3.iaanalytics_detail 
    where timestamp_pst >= "2016-01-28" 
    group by CAST(((datediff(timestamp_pst,'2016-01-03')/7)+1) as INT) 
     order by week_of_the_year 
+0

COUNT(DISTINCT)のようにIDを複製できればうまくいきません – Matt

関連する問題