質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

8638閲覧

big queryからethereumのデータを取得したい

trey_0329

総合スコア109

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/02/18 12:25

編集2019/02/18 12:30

背景
https://bigquery.cloud.google.com/table/bigquery-public-data:ethereum_blockchain.transactions
こちらのbigqueryから

  1. to_address = ‘0x6ebeaf8e8e946f0716e6533a6f2cefc83f60e8ab’ OR ‘0x91b9d2835ad914bc1dcfe09bd1816febd04fd689’

なものを取り出す

2.その中でfrom_addressが重複しているものに関しては、block_timestampが最新のものを一つだけ、残してあとは消す(最新の日付を取得して、重複は消す。ということです)
(こちらのサイトを参照しました。https://qiita.com/nogitsune413/items/f413268d01b4ea2394b1)

ということをやりたいです。

【問題】
下に私が書いたコードをのせましたが、
Query Failed
Error: Syntax error: Illegal input character "\342" at [35:18]
と出てしまいます。どうやらunicode characterを使ってしまっているようですが、そもそもコードが正しくないような気がするので、SQLに詳しい方、確認していただく事は可能でしょうか。
お手数おかけいたしますが、宜しくお願い致します

SQL

1SELECT 2 A.HASH, 3 A.nonce, 4 A.transaction_index, 5 A.from_address, 6 A.to_address, 7 A.value, 8 A.value/100000000000000000, 9 A.gas, 10 A.gas_price, 11 A.input, 12 A.receipt_cumulative_gas_used, 13 A.receipt_gas_used, 14 A.receipt_contract_address, 15 A.receipt_root, 16 A.receipt_status, 17 A.block_timestamp, 18 A.block_number, 19 A.block_hash 20FROM 21 `bigquery-public-data.ethereum_blockchain.transactions` AS A 22INNER JOIN ( 23 SELECT 24 to_address, 25 MAX(block_timestamp) AS Max 26 FROM 27 `bigquery-public-data.ethereum_blockchain.transactions` 28 GROUP BY 29 to_address) AS A1 30ON 31 A.to_address = A1.to_address 32 AND A.block_timestamp = A1.Max 33 34WHERE 35 A.to_address =0x6ebeaf8e8e946f0716e6533a6f2cefc83f60e8ab36 OR A.to_address=0x91b9d2835ad914bc1dcfe09bd1816febd04fd689;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

文字列の区切り記号はシングルクオート(')です。

SQL

1select * 2FROM 3 `bigquery-public-data.ethereum_blockchain.transactions` AS A 4WHERE 5 A.to_address= '0x6ebeaf8e8e946f0716e6533a6f2cefc83f60e8ab' 6 OR A.to_address='0x91b9d2835ad914bc1dcfe09bd1816febd04fd689'

追記

to_addressが限定されるなら相関副問合せの方が高速だと思います。

SQL

1SELECT * 2FROM `bigquery-public-data.ethereum_blockchain.transactions` A 3WHERE to_address in('0x6ebeaf8e8e946f0716e6533a6f2cefc83f60e8ab','0x91b9d2835ad914bc1dcfe09bd1816febd04fd689') 4 and not exists( 5 select 1 from `bigquery-public-data.ethereum_blockchain.transactions` 6 where to_address=A.to_address and block_timestamp>A.block_timestamp 7 )

投稿2019/02/18 12:34

編集2019/02/18 13:01
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trey_0329

2019/02/18 12:37

素早いご回答ありがとうございます。 かなり初歩的なミスでした。 コードの方は問題なさそうでしょうか? かなりごちゃごちゃしてしまっていますが。。。
trey_0329

2019/02/18 13:04

ありがとうございます! 大変勉強になりました
trey_0329

2019/02/18 14:24

度々すみません、仮に最古の日付を取得したい場合は、最後の where to_address=A.to_address and block_timestamp>A.block_timestamp ) を>から<にすればいいのでしょうか?
sazi

2019/02/18 14:25

ですね。
trey_0329

2019/02/18 14:28

ありがとうございます!
trey_0329

2019/02/20 11:28

度々すみません、先ほど上記コードを実行した後にファイルを確認したところ、本来取り除かれるべき値がまだ残っていました。どうやらそれらの残っている値が、元のシート状に3つ以上存在しているので、相関副問合せをすると一回しか消されず、3−1で2個残ってしまっているようです。 AND to_address=A.to_addressをもう1行加えると、本来あるべき値が逆に取り除かれてしまいます。 この場合はどのようなロジックを使えば良いのか、アイデアだけでもいいのでご教示いただけますでしょうか。 度々の質問にて大変恐縮ですが宜しくお願い致します。
sazi

2019/02/20 12:01 編集

> AND to_address=A.to_addressをもう1行加えると、本来あるべき値が逆に取り除かれてしまいます。 というのがどのような状況下分かりません。 exists内にその条件を加えても変わりはないはずですし、あり得るとしたら、同じ日付が複数件ある状態です。 例えばデータごとにユニークなIDなどがあればその値の最大値も条件にするなどが考えられますが、 どのような状況であっても、残すべきものを一意に限定できる条件が無ければそれ以上は無理です。
sazi

2019/02/21 00:34

一意にするものが無い場合は、カラム追加してrow_number()を利用して番号を一意に振るしかなさそうです。
trey_0329

2019/02/21 13:50

ありがとうございます。おっしゃる通りカラム追加してrow_number()でやるしかないようです。 まさしく同じ日付が複数件ある状態なので、もうちょっと他の方法を考えてみます。 大変ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問