はじめに
仕事でAthenaを使いだして、MySQLとほとんど同じ書き方で動いてくれるので助かっていたのですが、date型カラムで絞り込みしたときに、少しハマったので共有します。
最後まで読んで頂けると嬉しいです。
いきなり結論
SELECT * FROM users WHERE created_at <= CAST('2020-10-01' AS TIMESTAMP);
上記の通りです。
では、簡単な内容ですが解説していきます。
解説
このテーブルは、よくあるユーザー管理のテーブルを想定しています。
今回のクエリ文だと、「テーブルにある全ユーザーのうち、2020年10月1日までに登録したユーザー情報を取得したい」場合とかですね。
MySQLの場合
MySQLだと下の感じでクエリを作って投げれば、想定通りの値が返ってきます。
SELECT * FROM users WHERE created_at <= '2020-10-01';
しかし、Athenaではdate型カラムを絞り込む場合、TIMESTAMP型にキャストしてWHEREする必要があります。
キャストせずに検索した際のエラー例
MySQLのようにクエリ文を書いた場合、下記のようなエラーが出ます。
Your query has the following error(s):
SYNTAX_ERROR: line 1:67: '<=' cannot be applied to date, varchar(10)
date型で保持しているのに、文字列10には対応してないよって言っている様子です。
さらっとですが解説は以上です。
おまけ: Data Wranglerで書いたら
ということで、よくあるData Wranglerで書いた例だとこんな感じになります。
query = f"SELECT * FROM users WHERE created_at <= CAST('{target_date}' as TIMESTAMP);"
df = wr.athena.read_sql_query(query)
CASTした上で、シングルクォーテーションで囲ってます。
これ忘れがちなので注意して下さい。
フォーマット済み文字列リテラルで書いてますけど、ここは.format()
でも内部的には同じですね。
さいごに
今日は、Athenaのdate型カラムの絞り込みについて共有しました。
ツッコミや、何かご意見があれば、TwitterのDM等に頂けると嬉しいです!
最後までありがとうございました。