2017-11-21 17 views
0

に2つの単純なクエリに参加ここで第一クエリ月ごとにグループ化されたユーザーのIDを返すBigQueryの

SELECT 
    MONTH(TIMESTAMP(REGEXP_EXTRACT(date, '.*.([0-9]{4})$') + '-' + 
    REGEXP_EXTRACT(date, '.([0-9]{2}).') + '-' + 
    REGEXP_EXTRACT(date, '^([0-9]{2}).*'))) AS month, 
    COUNT(DISTINCT cons_id) 
FROM 
    [table1] 
WHERE 
    dbo_type = 'smth' 
GROUP BY month 

です。ここ は第二1ヶ月と同じでグループ化されたアクティブユーザーのIDを返す

SELECT 
    MONTH(TIMESTAMP(REGEXP_EXTRACT(date, '.*.([0-9]{4})$') + '-' + 
    REGEXP_EXTRACT(date, '.([0-9]{2}).') + '-' + 
    REGEXP_EXTRACT(date, '^([0-9]{2}).*'))) AS month, 
    COUNT(DISTINCT cons_id) 
FROM 
    [table1] 
WHERE 
    dbo_type = 'smth' 
    AND success_operations > 0 
GROUP BY month 

です。どのようANSWER ---

 
month | users  | active_users 
------| --------- | --------- 
9  | 100  | 50 
10 | 120  | 60 
11 | 140  | 70 

のような単純なテーブルを得るためにそれらを結合します----

おかげで、マイケル!

#legacySQL 
SELECT 
    INTEGER(REGEXP_EXTRACT(DATE, '.([0-9]{2}).')) AS month, 
    EXACT_COUNT_DISTINCT(cons_id) AS users, 
    EXACT_COUNT_DISTINCT(IF(success_operations > 0, cons_id, NULL)) AS active_users 
FROM 
    [project:dataset.table] 
WHERE 
    dbo_type = 'smth' 
GROUP BY month 
ORDER BY month 

答えて

1

に注意してください(あなたがあなたの質問にそれを使用しているように見えるよう)のBigQueryレガシーSQLについては、以下の

#legacySQL 
SELECT 
    MONTH(TIMESTAMP(REGEXP_EXTRACT(date, '.*.([0-9]{4})$') + '-' + 
    REGEXP_EXTRACT(date, '.([0-9]{2}).') + '-' + 
    REGEXP_EXTRACT(date, '^([0-9]{2}).*'))) AS month, 
    COUNT(DISTINCT cons_id) AS users, 
    COUNT(DISTINCT IF(success_operations > 0, cons_id, NULL)) AS active_users 
FROM 
    [project:dataset.table1] 
WHERE 
    dbo_type = 'smth' 
GROUP BY month 

をお試しください:レガシーSQLで(DISTINCT)COUNTはおおよそのものです - 詳細を見ます - https://cloud.google.com/bigquery/docs/reference/legacy-sql#countdistinct

あなたはまた、それはトンに見える代わりに

EXACT_COUNT_DISTINCTを使用することができます/

#standardSQL 
SELECT 
    REGEXP_EXTRACT(DATE, '.([0-9]{2}).') AS month, 
    COUNT(DISTINCT cons_id) AS users, 
    COUNT(DISTINCT IF(success_operations > 0, cons_id, NULL)) AS active_users 
FROM `project.dataset.yourTable` 
WHERE dbo_type = 'smth' 
GROUP BY month 

はあなたがテストすることができ、ダミーデータを使用してそれで遊ぶ:私oを代わりに長い

MONTH(TIMESTAMP(REGEXP_EXTRACT(date, '.*.([0-9]{4})$') + '-' + 
    REGEXP_EXTRACT(date, '.([0-9]{2}).') + '-' + 
    REGEXP_EXTRACT(date, '^([0-9]{2}).*'))) AS month 

は、あなたが以下試すことができBigQueryの標準SQLのためだけ

INTEGER(REGEXP_EXTRACT(DATE, '.([0-9]{2}).')) 

を使用することができます以下のようになります。

#standardSQL 
WITH `project.dataset.yourTable` AS (
    SELECT '31-12-2017' DATE, 1 cons_id, 1 success_operations, 'smth' dbo_type UNION ALL 
    SELECT '31-12-2017', 2, 0, 'smth' UNION ALL 
    SELECT '31-12-2017', 3, 0, 'smth' 
) 
SELECT 
    REGEXP_EXTRACT(DATE, '.([0-9]{2}).') AS month, 
    COUNT(DISTINCT cons_id) AS users, 
    COUNT(DISTINCT IF(success_operations > 0, cons_id, NULL)) AS active_users 
FROM `project.dataset.yourTable` 
WHERE dbo_type = 'smth' 
GROUP BY month 
+0

ありがとうございます。集計関数MONTHは、従来のSQLに対してのみ機能します。同様にREGEXP_EXTRACT –

+0

ああ、私はこれを逃した - カウントする方法に焦点を当てていた - すぐにこの1つに再回答します。明確にしてください - レガシーまたはスタンダードでそれを必要としますか?あなたの日付フィールドの例を挙げることができますか? –

+0

私の答え –