2017-11-16 27 views
1

私のクエリで特定の日付を除外しようとしています。次のように私は私のクエリで使用していたコードの行は次のとおりです。BigQueryの日付比較

(date(date_add(date_time,-1,'year')) < date(date_add(current_date(),-1,'year'))) OR year(date_time) = 2017) 

アイデアそれらの同じ日に対応して2016年からのデータだけでなく、2017年にすべてのデータYTDを取得することです。したがって、私が望むものを適切なバージョンで実行すると、2016年11月16日までのすべてのデータYTDと2016年のすべてのデータが返されます。

ただし、これでWHERE句では、私のクエリは、記載されたパラメータに収まらない日付を返します。私は完全に明白な何かを見逃しているかもしれないが、これは私をナットにしている。私が紛失している日付をフィルタリングする特別な方法はありますか?

編集:ここに私のデータの一部

[date]  [today] [uniques]  
2016-01-01 2017-11-16 363878 
2016-01-02 2017-11-16 383813 
2016-01-03 2017-11-16 392579 
2016-01-04 2017-11-16 709367 
.. 
.. 
2016-11-15 2017-11-16 841850 
2016-11-16 2017-11-16 847831 
2016-11-17 2017-11-16 797610 
2016-11-18 2017-11-16 187158 
2016-11-19 2017-11-16 521100 
.. 
2017-11-12 2017-11-16 297604 
2017-11-13 2017-11-16 527858 
2017-11-14 2017-11-16 474051 
2017-11-15 2017-11-16 569686 

である私は自分自身違いは、日付の書式ではなかったことを確認するために、今日の行を追加しました。このデータでは、中間セクションの下3行は返されません。それ以外のものは、私が設定したパラメータに合わせて返さなければなりません。

すべてのヘルプに感謝します。ありがとう!

以下
+0

以下のようにダミーデータで遊ぶあなたの予想ロジックが何であるかを言葉で策定日付に関して? –

+0

申し訳ありません。私は2017年からのすべてのデータと2016年の対応する日付を取得しようとしています。今日、私はYTDデータと2016年のすべてのデータを11月16日まで取得します。 – kshoe94

+0

OK、あなたのデータのいくつかのサンプルを提供することは素晴らしいでしょう - ほんの数行と期待される結果 - あなたは[How to Ask](http://stackoverflow.com/help/how-to-ask) [最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve) –

答えて

1

は、BigQueryの標準SQLのためである:

#standardSQL 
SELECT date_time, uniques 
FROM `project.dataset.yourTable` 
WHERE (PARSE_DATE('%Y-%m-%d', date_time) < DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR)) 
OR EXTRACT(YEAR FROM PARSE_DATE('%Y-%m-%d', date_time)) = 2017 

あなたは、それは非常使用することをお勧めし

#standardSQL 
WITH `project.dataset.yourTable` AS (
    SELECT '2016-01-01' date_time, 363878 uniques UNION ALL 
    SELECT '2016-01-02', 383813 UNION ALL 
    SELECT '2016-01-03', 392579 UNION ALL 
    SELECT '2016-01-04', 709367 UNION ALL 

    SELECT '2016-11-15', 841850 UNION ALL 
    SELECT '2016-11-16', 847831 UNION ALL 
    SELECT '2016-11-17', 797610 UNION ALL 
    SELECT '2016-11-18', 187158 UNION ALL 
    SELECT '2016-11-19', 521100 UNION ALL 

    SELECT '2017-11-12', 297604 UNION ALL 
    SELECT '2017-11-13', 527858 UNION ALL 
    SELECT '2017-11-14', 474051 UNION ALL 
    SELECT '2017-11-15', 569686 
) 
SELECT date_time, uniques 
FROM `project.dataset.yourTable` 
WHERE (PARSE_DATE('%Y-%m-%d', date_time) < DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR)) 
OR EXTRACT(YEAR FROM PARSE_DATE('%Y-%m-%d', date_time)) = 2017 

を下回っているとして、あなたの質問からダミーデータを使用してそれで遊ぶ/テストすることができますBigQuery Standard SQL - それでもレガシーSQLを使用している場合 - 考慮するとMigrating to Standard SQL

(私に似ている)レガシーSQLにあなたのコードを持っている - あなたは

#legacySQL 
SELECT date_time, uniques 
FROM [project:dataset.yourTable] 
WHERE (DATE(date_time) < DATE(DATE_ADD(CURRENT_DATE(), -1, 'year'))) 
OR YEAR(date_time) = 2017 

の下に使用することができますあなたがテストすることができます/

#legacySQL 
SELECT date_time, uniques 
FROM --[project:dataset.yourTable] 
    (SELECT '2016-01-01' date_time, 363878 uniques), 
    (SELECT '2016-01-02' date_time, 383813 uniques), 
    (SELECT '2016-01-03' date_time, 392579 uniques), 
    (SELECT '2016-01-04' date_time, 709367 uniques), 

    (SELECT '2016-11-15' date_time, 841850 uniques), 
    (SELECT '2016-11-16' date_time, 847831 uniques), 
    (SELECT '2016-11-17' date_time, 797610 uniques), 
    (SELECT '2016-11-18' date_time, 187158 uniques), 
    (SELECT '2016-11-19' date_time, 521100 uniques), 

    (SELECT '2017-11-12' date_time, 297604 uniques), 
    (SELECT '2017-11-13' date_time, 527858 uniques), 
    (SELECT '2017-11-14' date_time, 474051 uniques), 
    (SELECT '2017-11-15' date_time, 569686 uniques) 
WHERE (DATE(date_time) < DATE(DATE_ADD(CURRENT_DATE(), -1, 'year'))) 
OR YEAR(date_time) = 2017 
+0

ご協力いただきありがとうございます!私のロジックは間違っていませんが、私が修正するのを手助けしようとしていた人物がCNFでフィルターを持っていて、「OR」ステートメントの1つがかっこの外側にあることに気付かず、その条件が満たされたところで – kshoe94

+0

もう一度答えをチェックすることをお勧めします!あなたの質問に基づいて - WHERE句に入れたときの最初の式は間違っていました!答えの表現とそれを比較してください - レガシーバージョンで - あなたはリンゴとリンゴを比較します:o) –