みなさん昨日のDune講座<初級>を見ていただいてありがとうございます。執筆時点(8月18日18時半)で200いいね、135ブックマークをいただけて大変嬉しい気持ちです。Duneに関心のある方が多いこともわかったので引き続き中級、上級を経てDuneで作りたいダッシュボードを作れるようになりましょう。
初級をまだみていない方はこちらから↓
今回は<初級+>編、データの範囲指定や複数の条件を指定、カラムの名前の変更とユニークな値の抽出の4つを解説します。本当は四則演算とかまで行きたかったんですが、あまり詰め込みすぎても良くないので前回の続編として初級の範囲内に収まるレベルのみを<初級+>としてまとめました。
Special thanks to @Guss3.eth
※コードブロックを使用して説明しているため、なるべくパソコンからのアクセスをお勧めします。またこの講座を受けるためにはパソコンが必要です。
データの範囲指定〈WHERE〉
昨日の復習と応用を始めに行います。データのフィルタリングと同じ「WHERE」ですが昨日は「=」で、ある条件に一致する時というフィルタリングをかけたと思います。実は「>, <」の不等号を利用することでデータの範囲指定をすることもできます。
WHERE <何が(カラム名)> > <何のとき> /* より大きい */
WHERE <何が(カラム名)> < <何のとき> /* より小さい */
WHERE <何が(カラム名)> >= <何のとき> /* 以上 */
WHERE <何が(カラム名)> <= <何のとき> /* 以下 */
例を前回と同じデータセットで確認してみましょう。1ETH以上の取引を10個取得してみます。まずいくらで取引されたかをETH建で取得できるカラム名を探さないといけないです。こういうときは一旦「SELECT *」で取ってみるんでしたよね。
SELECT * FROM opensea_v3_ethereum.events
LIMIT 10
上記のコードを実行してみて取得できたデータから、取引のETH建価格を示しているカラムは「amount_original」であることがわかりました。
それでは「1ETH以上の取引を10個」取得してみましょう。その時のコードは下記のようになります。
SELECT * FROM opensea_v3_ethereum.events
WHERE amount_original >= 1
LIMIT 10
ここで注意なのは不等号の順番を間違えるとエラーが出るということ。
正: 「<=」「>=」
誤: 「=<」「=>」
実は=を先に持ってきてしまうとダメなんです。私も最初の頃はよく間違えていたのでみなさんも注意ポイントとして覚えておいていただけると嬉しいです。
そしてもう一つの注意ポイントはアドレスなどの文字列の場合は「’ ’」で囲む必要があり、数字などの値を扱う場合は「’ ’」を付けなくていいということ。初級と比べて覚えることがどんどん増えてきていますが頑張ってついてきてください!
文字列: ‘123’
値: 123
では練習として一つすることを追加します、高額なNFTといえばAZUKIやBAYCが思い浮かびますね。そんなbluechip NFTの中でも、5ETHを割り込んだdoodlesが5ETH以上で取引された事例を50個取得してみましょう。どのNFTかを指定するためにはcontract addressを含むカラムを探してみます。
ここでは「nft_contract_address」を活用するとよさそうですね。早速先ほどの条件のコードを書いてみましょう、と言いたいところですがここで「複数の条件」をよりスマートに書くための新しい文法を覚えましょう。
データを複数条件指定〈AND〉
データの指定に「WHERE」を使って複数条件指定したい場合は、日本語の「且つ」と同じ使い方で「AND」を使用します。使い方は以下のようになります。
WHERE <何が(カラム名)> = '<何のとき>' /* 条件1 */
AND <何が(カラム名)> = '<何のとき>' /* 条件2 */
AND <何が(カラム名)> = '<何のとき>' /* 条件3以降も同じ */
これを踏まえた上で2回目のWHEREをANDに変えてみてdoodlesの5ETH以上の取引を50個取得してみましょう。その時のコードは下記のようになります。
SELECT * FROM opensea_v3_ethereum.events
WHERE amount_original >= 5
AND nft_contract_address = '0x8a90cab2b38dba80c64b7734e58ee1db38b8992e'
LIMIT 50
3回目以降のWHEREも同じくANDを利用することでいくつでも取得する情報に条件を付与することができます。例えば売り主をいま表示されている取得済みのデータの中から適当に選んで指定して取得してみましょう。
SELECT * FROM opensea_v3_ethereum.events
WHERE amount_original >= 5
AND nft_contract_address = '0x8a90cab2b38dba80c64b7734e58ee1db38b8992e'
AND seller = '0x6982f5da70802f882fcc2cf2f02b3ba6778cc61e'
こんな感じの要領で高度な分析になるほどANDをよく使いますので、ぜひ覚えておいてください。
カラムの名前を変更〈AS〉
今後たくさんのqueryを作っていく上で元々ついているカラム名では長くて分かりにくいので、自分のわかりやすい名前に変えたくなったりするかもしれません。そういうときには「as」を使って名前を上書きすることができます。ちなみにこの機能が後々とても重要になってきます。
SELECT <この名前を> AS <この名前に> /* SELECT以外でも利用可能 */
例えばCompoundのデータセット「compound_v2_ethereum.borrow」の中にある「symbol」というカラムだけを取得し、「token」という名前に変更して100個のデータを取得してみましょう。その時のコードは下記のようになります。
SELECT symbol AS token FROM compound_v2_ethereum.borrow
LIMIT 100
実際に100個のデータが取得できカラム名を「token」に変更できました。みなさんは同じ画面になっていますか?
一方でこのバラバラになったトークンは全部で何種類あるんだろう、、ってときにデータをまとめる事ができるやつを次に紹介します。
カラムのユニークな値を取得〈DISTINCT〉
今日はここまでやって最後にしましょう、カラム内に同一の値や文字列がある場合は一括りにして重複がない状態で表示できます。例えばあるアドレスやトークン名などで重複があるものをまとめてユニークな値にすることができます。
SELECT DISTINCT <何を(カラム名)>
実際にトークン名で「DISTINCT」してみるとコードは下記のようになります。
SELECT DISTINCT symbol AS token FROM compound_v2_ethereum.borrow
LIMIT 100
実行してみたら実際に7種類のトークンが取得できました。追加でキニナル部分のそれぞれのトークンが合計で何枚動いていて、何回のトランザクションがあったかの計算は次の中級の部分で説明できればと思います。
まとめ
ここまでみなさんついて来れていますか?7個の文法を覚えてきましたが、初級と初級+で出てきた内容は基礎的なものでこれからもかなり頻出するものなのでしっかり覚えておいてください。不安な点があれば私のX!までDMをください!
明日以降も大きなニュースがない場合は中級、上級とどんどん実用性のある内容や応用部分へと進んでいきます。まだ書いてないので情報量が多くなりそうな場合は今回の<初級+>みたいに日を分けて説明していきます。
この講座から1人でも多くオンチェーン分析に興味を持ってDuneユーザーが増えると嬉しいです。
次のレベルのDune講座はこちらから↓