æ¬é£èŒã§ã¯ããããã¯ãã§ãŒã³ã®åºæ¬çãªä»çµã¿ã解説ããªããããªã³ãã§ãŒã³ããŒã¿ãåæããããã®åºæ¬çãªææ³ã«ã€ããŠãå
š8åã§ç޹ä»ããŸãã æçµåãšãªãä»åã¯ãéå»ã®é£èŒèšäºã§ç޹ä»ããããªãã£ãDuneïŒåæããŒã«ïŒã®Tipsçãªæçšæ©èœããåæã®ããã®é«åºŠãªSQLæ§æã«ã€ããŠã玹ä»ããŸãã Dune Tips Duneã®ãããªSQLããŒã¹ã®åæããŒã«ã¯ãSQLã§èšè¿°ãããã¯ãšãªãåå©çšããããã®ããŸããŸãªæçšæ©èœãå®è£
ãããŠããããšãå€ããããŸãããã®äžã§ããå€ãã®åæããŒã«ã§é »ç¹ã«äœ¿çšããããã©ã¡ã¿åæ©èœããã¥ãŒäœææ©èœã«ã€ããŠã玹ä»ããŸãã Parameters SQLã¯ãšãªäžã®çµãèŸŒã¿æ¡ä»¶ã«å«ãŸãããæå»ãç¹å®ã®æååãªã©ã®å€ãããã©ã¡ã¿åããŠå®è¡æã«æå®ã§ããããã«ãããããã©ã¡ã¿ã ããå€ããŠåãã¯ãšãªãäœåºŠãå®è¡ããããããããšããããããŸããDuneã®å Žåããã©ã¡ã¿åãããç®æã«ååãã€ã㊠{{ }} ã§å²ãããšã§ãç°¡åã«ãã©ã¡ã¿ã®å€éšåãå®çŸã§ããŸããã³ãŒã1ã«ãuniswapãšãã忣ååŒå Žã®ååŒå±¥æŽãããããŒã¯ã³ãã¢ã®çš®é¡ããã©ã¡ã¿ã§æå®ããŠéèšãå®è¡ããã¯ãšãªäŸã瀺ããŸãã ã³ãŒã1 . token_pairããã©ã¡ã¿åããã¯ãšãªäŸ SELECT token_pair, COUNT(1) AS cnt, SUM(amount_usd) AS total_amount_usd FROM uniswap_v3_ethereum.trades WHERE block_time BETWEEN timestamp '2023-01-01 00:00:00' AND timestamp '2023-01-31 23:59:59' AND token_pair = '{{token_pair}}' GROUP BY token_pair LIMIT 100 ãã©ã¡ã¿åããç®æã®ããŒã¿ã¯ãå³1ã«ç€ºããããªèšå®ç»é¢ã§ãããŒã¿åãæå®ããããéžæè¢ãèšå®ããããä»ã®ã¯ãšãªã®åºåçµæããã©ã¡ã¿ãšããŠèšå®ãããããšãã£ãã«ã¹ã¿ãã€ãºãå¯èœã§ãããã©ã¡ã¿åæ©èœãããŸã掻çšããããšã§ãã²ãšã€ã®æ±çšçãªã¯ãšãªãçšããŠãããŸããŸãªåãå£ããã®ããŒã¿åæããããªãããšãã§ããŸãã å³1. ãã©ã¡ã¿ã®è©³çްèšå®ç»é¢ Query Views éå»ã®èšäºã§ã解説ããéããé¢ä¿æŒç®ã®éå
æ§ã«ãããSQLã¯ãšãªã®åºåçµæã¯å¥ã®SQLã¯ãšãªã®å
¥åïŒFROMå¥ã«æå®ããããŒãã«ïŒã«ãªãããšãã§ããŸããããã¯ãWITHå¥ãçšããŠã²ãšã€ã®ã¯ãšãªå
ã§ååä»ãããããŒãã«ãåå©çšããã ãã§ãªããç°ãªãã¯ãšãªéã§ãåå©çšãå¯èœã§ãã SQLèªäœã®æ©èœã«ãããCREATE VIEWããªã©ã®æ§æãçšããŠãã¯ãšãªçµæãããŒãã«ãšããŠæ±ãããšãã§ãããã¥ãŒãå®çŸ©ããæ©èœããããŸããDuneã®å Žåã¯ãã¯ãšãªãšãã£ã¿ã§äœæãä¿åããã¯ãšãªã«ã¯èªåçã«IDãæ¯ãããããããã®IDãçšããŠããã«ç°¡åã«ã¯ãšãªçµæã®åç
§ãã§ããŸãã äŸãã°ã https://dune.com/queries/3238025 ãšããURLã§ã¢ã¯ã»ã¹ã§ããã¯ãšãªã®çµæãSQLã§å©çšããã«ã¯ãURLã«å«ãŸãã queries/ 以äžã®ã¯ãšãªIDãçšããŠããquery_3238025ããšãã£ãããŒãã«åã§åç
§ããã ãã§ãã å³2. ãã¥ãŒãšããŠåç
§ãããã¯ãšãªïŒ https://dune.com/queries/3238025 ïŒã®å®è¡äŸ ã³ãŒã2 . ã¯ãšãªID: 3238025ã®ãã¥ãŒãåç
§ããã¯ãšãªäŸ SELECT * FROM query_3238025 å³3. ã³ãŒã2ã®å®è¡çµæïŒå³2ãšåæ§ã®åºåçµæã«ãªãïŒ èªèº«ãäœæããã¯ãšãªã ãã§ãªããä»ã®ãŠãŒã¶ãŒãäœæãå
¬éããŠããã¯ãšãªãç°¡åã«åç
§ã§ããã®ã§ããªã³ã©ã€ã³ã³ãã¥ããã£å
šäœã§å
±åµçãªããã·ã¥ããŒãéçºãå®çŸã§ããããšããDuneã®ãµãŒãã¹ã®é
åã§ãã åæã®ããã®é«åºŠãªSQL æåŸã«ãWindow颿°ãCASEã»ã©é »åºã§ã¯ãªããã®ã®ãSQLã®è¡šçŸåãæ¡å€§ãããé«åºŠãªæ§æãšããŠãROLLUPïŒè¶
éåïŒãWITH RECURSIVEïŒååž°ã¯ãšãªïŒã®äœ¿ãæ¹ãã玹ä»ããŸãã ROLLUP ããã·ã¥ããŒããã¬ããŒããäœæããéãã«ããŽãªããšã®éèšãšãããããåç®ããå°èšãå
šäœã®åèšãªã©ãäžåºŠã«è¡šç€ºãããå ŽåããããŸããSQLã®å Žåãåãã«ã©ã ãæã£ãããŒãã«å士ãUNIONãŸãã¯UNION ALLå¥ã§é£çµããããšã§ãäžã€ã®ããŒãã«ã«ãŸãšããããšãã§ãããããUNIONå¥ãçšããŠå°èšã»åèšãå«ãã¬ããŒããäœæããããšãã§ããŸãã ã³ãŒã3 . UNION ALLå¥ãçšããŠãEthereum TraceããŒã¿ã®çš®é¡ããšã®ä»¶æ°ãšåèšãåæã«ååŸããã¯ãšãª WITH target_traces AS ( SELECT * FROM ethereum.traces WHERE block_time BETWEEN timestamp '2023-01-01 00:00:00' AND timestamp '2023-01-01 23:59:59' ) SELECT 'ALL' AS type, count(1) AS cnt FROM target_traces UNION ALL SELECT type, count(1) as cnt FROM target_traces GROUP BY type å³4. ã³ãŒã3ã®åºåçµæ ããããåãããŒãã«ã«å¯ŸããŠè€æ°ã®SELECTæãå®è¡ããUNIONã§é£çµããã®ã¯ãå®è¡ã³ã¹ããé«ããèšè¿°ãåé·ã«ãªããã¡ã§ããããã§ãGROUP BYå¥ã«ROLLUPå¥ãæå®ããããšã§ãå
šäœã®åèšãšå°èšãåæã«èšç®ããããšãã§ããŸãã ã³ãŒã4 . ã³ãŒã3ãšåæ§ã®å
容ãROLLUPå¥ã§å®çŸããã¯ãšãª SELECT type, count(1) AS cnt FROM ethereum.traces WHERE block_time BETWEEN timestamp '2023-01-01 00:00:00' AND timestamp '2023-01-01 23:59:59' GROUP BY ROLLUP(type) å³5. ã³ãŒã4ã®åºåçµæ ãŸããROLLUPå¥ã«ã¯è€æ°ã®ã«ã©ã ãæå®ããããšãã§ããŸããROLLUPå¥ã«è€æ°ã®ã«ã©ã ãæå®ããå Žåãæå®ããé ã«å¿ããŠå°èšã®ã°ã«ãŒãã现ååãããŸããäŸãã°ãã³ãŒã5ã«ç€ºããšãããROLLUPã«typeãšsuccessãšãã2ã€ã®ã«ã©ã ãæå®ããå ŽåããŸãåé ã«æå®ããtypeãããšã«å°èšãšåèšãèšç®ãããããã«successã®äžèº«ã«å¿ããŠçްååãããå°èšãèšç®ãããŸãã2ã€ç®ã«æå®ããsuccessã®ã¿ã«å¿ããŠçްååãããå°èšïŒãã®å Žåã¯success=trueã®ã¬ã³ãŒãå
šäœãšsuccess=falseã®ã¬ã³ãŒãå
šäœã®å°èšïŒã¯èšç®ãããªãããšã«æ³šæããŠãã ããã ã³ãŒã5 . ROLLUPã«è€æ°ã«ã©ã ãæå®ããã¯ãšãªäŸ SELECT type, success, count(1) AS cnt FROM ethereum.traces WHERE block_time BETWEEN timestamp '2023-01-01 00:00:00' AND timestamp '2023-01-01 23:59:59' GROUP BY ROLLUP(type, success) å³6. ã³ãŒã5ã®åºåçµæ ãããæå®ããã«ã©ã ã®ãã¹ãŠã®çµã¿åããã«å¯Ÿããå°èšãèšç®ãããå Žåã¯ãROLLUPã§ã¯ãªãCUBEå¥ãå©çšã§ããŸããã³ãŒã6ã«ç€ºããCUBEå¥ã«ããã¯ãšãªäŸã§ã¯ãå³7ã«ç€ºããšããã2çªç®ã«æå®ããsuccessã«ã©ã ã ãã«åºã¥ãå°èšãèšç®ãããŠããŸãã ã³ãŒã6 . ã³ãŒã5ã®ROLLUPãCUBEã«æžãæããã¯ãšãªäŸ SELECT type, success, count(1) AS cnt FROM ethereum.traces WHERE block_time BETWEEN timestamp '2023-01-01 00:00:00' AND timestamp '2023-01-01 23:59:59' GROUP BY CUBE(type, success) å³7. ã³ãŒã6ã®åºåçµæ ããã«ã¹ã¿ãã€ãºãããæ¡ä»¶ã«åºã¥ãå°èšãèšç®ãããå ŽåãGROUPING SETSå¥ãçšããããšãã§ããŸããGROUPING SETSå¥ã«ã¯ãGROUP BYã®å¯Ÿè±¡ãšãããã«ã©ã ã®çµã¿åãããåæããŠæå®ããããšãã§ããŸãããROLLUP(c1, c2)ããšããèšè¿°ã¯ãGROUPING SETS( (c1, c2), (c1), () )ãã«çããããCUBE(c1, c2)ããšããèšè¿°ã¯ãGROUPING SETS( (c1, c2), (c1), (c2), () )ãã«çãããªããŸãã ã³ãŒã7 . ã³ãŒã5ã®ROLLUPãGROUPING SETSã§æžãæããã¯ãšãªäŸ SELECT type, success, count(1) AS cnt FROM ethereum.traces WHERE block_time BETWEEN timestamp '2023-01-01 00:00:00' AND timestamp '2023-01-01 23:59:59' GROUP BY GROUPING SETS( (type, success), (type), () ) å³8. ã³ãŒã7ã®åºåçµæ WITH RECURSIVE SQLã«ã¯ãæç¶ãåããã°ã©ãã³ã°èšèªã®foræã®ãããªç¹°ãè¿ãåŠçã®ããã®æ§æããªãããã鿬¡åŠçãèŠæãšæãããã¡ã§ããããããWITHå¥ã®ãªãã§èªåèªèº«ã®ããŒãã«ãåç
§ã§ããWITH RECURSIVEïŒååž°ã¯ãšãªïŒãçšãããšãç¡éã«ãŒããå«ãç¹°ãè¿ãåŠçãSQLã§å®è¡ããããšãå¯èœã§ãã ã³ãŒã8ã«ãWITH RECURSIVEãçšããŠãã£ããããæ°åãèšç®ããã¯ãšãªäŸã瀺ããŸããWITH RECURSIVEã®åºæ¬æ§æã¯ãUNION ALLå¥ãçšããŠ2ã€ã®SELECTæãçµåãã1ã€ç®ã®SELECTæã§ã¯ç¹°ãè¿ãã®èµ·ç¹ãšãªãã¬ã³ãŒããæå®ãã2ã€ç®ã®SELECTæã§ç¹°ãè¿ãäžã®èšç®åŠçãšçµäºæ¡ä»¶ãæå®ããŸãã ã³ãŒã8 . WITH RECURSIVEãçšããŠãã£ããããæ°åãèšç®ããã¯ãšãªäŸ WITH RECURSIVE fib (x, a, b) AS ( SELECT 0, 0, 1 UNION ALL SELECT x + 1, b, a + b FROM fib WHERE x < 10 ) SELECT x, a FROM fib; å³9. ã³ãŒã8ã®åºåçµæ WITH RECURSIVEãçšããå®çšçãªã¯ãšãªäŸãšããŠãæå·è³ç£ã®ååŸäŸ¡é¡ãç§»å平忳ã«ãã£ãŠèšç®ããã¯ãšãªãã³ãŒã9ã«ç€ºããŸããæå·è³ç£ã®ååŸäŸ¡é¡ã®èšç®æ¹æ³ã«ã€ããŠã¯ãåœçšåºã«ããã æå·è³ç£ã«é¢ããçšåäžã®åæ±ãã«ã€ããŠïŒïŒŠïŒ¡ïŒ±ïŒ ãïŒpp.15-16ïŒã®äºäŸãåç
§ããŸãã ã³ãŒã9 . WITH RECURSIVEãçšããŠãç§»å平忳ã«ããæå·è³ç£ã®ååŸäŸ¡é¡ãèšç®ããã¯ãšãª WITH RECURSIVE t (id, btc_balance, trade_time, trade_type, trade_amount, btc_amount, jpy_amount) AS ( SELECT ROW_NUMBER() OVER(ORDER BY trade_time) AS id , SUM(btc_amount) OVER(ORDER BY trade_time) AS btc_balance , * FROM query_3238025 ) , moving (id, trade_time, trade_type, btc_amount, jpy_amount, btc_balance, btc_moving_avg_price) AS ( (SELECT id, trade_time, trade_type, btc_amount, jpy_amount, btc_balance, 1.0 * abs(jpy_amount) / btc_amount AS btc_moving_avg_price FROM t WHERE id = 1) UNION ALL (SELECT t.id, t.trade_time, t.trade_type, t.btc_amount, t.jpy_amount, t.btc_balance, CASE WHEN t.trade_type = 'Sell' THEN moving.btc_moving_avg_price ããã§ã®ãµã³ãã«ããŒã¿ã¯ãäžèšã®ãããªå
èš³ã§ãããã³ã€ã³ã®è³Œå
¥ãšå£²åŽããããªã£ãå Žåãæ³å®ããŸãããã®ãµã³ãã«ããŒã¿ã¯ãå³2ã«ç€ºããã¯ãšãªïŒ https://dune.com/queries/3238025 ïŒããåç
§ã§ããŸãã 3æ1æ¥ 4 BTCã 1,845,000åã§è³Œå
¥ ä¿ææ°é 4 BTC 6æ20æ¥ 2 BTCã 1,650,000åã§è³Œå
¥ ä¿ææ°é 6 BTC 7æ10æ¥ 2 BTCã 2,400,000åã§å£²åŽ ä¿ææ°é 4 BTC 9æ15æ¥ 0.5 BTCã 542,800åã§è³Œå
¥ ä¿ææ°é 4.5 BTC 11æ30æ¥ 3 BTCã 2,895,000åã§å£²åŽ ä¿ææ°é 1.5 BTC ã³ãŒã9ã®ã¯ãšãªã现ååããŠè§£èª¬ããŸãããŸãããµã³ãã«ããŒã¿ã«ã¯ååŒæç¹ã§ã®ä¿æBTCã®æ®é«ã瀺ãã«ã©ã ããªãã®ã§ãWindow颿°ãçšããŠçޝèšã®BTCæ®é«ãèšç®ããŸãããŸããåæ±ãç°¡åã«ãããããååŒå±¥æŽé ã«é£çªã®IDãä»äžããŸãïŒã³ãŒã10ïŒã ã³ãŒã10 . BTCååŒå±¥æŽã®ååŠçéšå SELECT ROW_NUMBER() OVER(ORDER BY trade_time) AS id , SUM(btc_amount) OVER(ORDER BY trade_time) AS btc_balance , * FROM query_3238025 ç§»å平忳ãçšããæå·è³ç£ã®å¹³åå䟡ã¯ããååŒæç¹ã§ä¿æããæå·è³ç£ã®ç°¿äŸ¡ã®ç·é¡ / ååŒæç¹ã§ä¿æããæå·è³ç£ã®æ°éãã§èšç®ãããŸãã äŸãã°ã3æ1æ¥æç¹ã§ã®ãããã³ã€ã³ã®å¹³åå䟡ã¯ããããã³ã€ã³ã®ç°¿äŸ¡ã®ç·é¡ã1,845,000åã§ãããä¿æãããããã³ã€ã³ã®æ°éã 4 BTCãªã®ã§ã1 BTCãããã®å¹³åå䟡㯠1,845,000 / 4 = 461,250åãšãªããŸããã³ãŒã11ã«ç€ºãååž°ã¯ãšãªã®ãªãã§ã¯ãUNION ALLå¥ã®ååŽã®SELECTæã§ããã®èšç®ããããªã£ãŠããŸãã ç¶ããŠã6æ20æ¥æç¹ã®å Žåãèšç®ããŸãããã®æç¹ã§ã®ãããã³ã€ã³ã®ç°¿äŸ¡ã®ç·é¡ã¯ãéå»ã«ä¿æããŠãããããã³ã€ã³ã®ç°¿äŸ¡ïŒæ°èŠè³Œå
¥é¡ãšãªããŸããããªãã¡ãäžèšã§èšç®ããå¹³åå䟡461,250å Ã ä¿æãããã³ã€ã³ 4 BTC + æ°èŠè³Œå
¥é¡ 1,650,000å ïŒ 3,495,000åã§ãããŸãããã®æç¹ã§ä¿æãããããã³ã€ã³ã®æ°é㯠6 BTCãªã®ã§ã1 BTCãããã®å¹³åå䟡㯠3,495,000 / 6 = 582,500åãšãªããŸãããã®èšç®ã¯ãã³ãŒã11ã«ãããŠã¯ãWHEN t.trade_type = ‘Buy’ THENïœãã«ç¶ãç®æã§èšç®ããŠããŸãã 7æ10æ¥ã®ååŒã¯ãä¿æããŠãããããã³ã€ã³ã®å£²åŽãªã®ã§ãå¹³åå䟡ã«ã¯åœ±é¿ããã1 BTCãããã®å¹³åå䟡ã¯6æ20æ¥æç¹ãšåã582,500åãšãªããŸããã³ãŒã11ã«ãããŠã¯ãWHEN t.trade_type = ‘Sell’ THENãã«ç¶ãç®æãã該åœããèšç®ç®æã§ãã 9æ15æ¥ã®ååŒã§ã¯ãæ°ãã« 542,800ååã®ãããã³ã€ã³ã賌å
¥ããåèš4.5 BTCãä¿æããŠããããšã«ãªãã®ã§ãå¹³åå䟡㯠ïŒ582,500å à 4 BTC + 542,580åïŒ/ 4.5 BTC = 638,400åãšãªããŸãã 11æ30æ¥ã®ååŒã§ã¯ããããã³ã€ã³ã®å£²åŽã®ããå¹³åå䟡ã«ã¯åœ±é¿ãããåãã638,400åã1 BTCãããã®å¹³åå䟡ã§ãã ã³ãŒã11 . ç§»å平忳ãèšç®ããååž°ã¯ãšãªã®äžæ žéšå (SELECT id, trade_time, trade_type, btc_amount, jpy_amount, btc_balance, 1.0 * abs(jpy_amount) / btc_amount AS btc_moving_avg_price FROM t WHERE id = 1) UNION ALL (SELECT t.id, t.trade_time, t.trade_type, t.btc_amount, t.jpy_amount, t.btc_balance, CASE WHEN t.trade_type = 'Sell' THEN moving.btc_moving_avg_price WHEN t.trade_type = 'Buy' THEN (moving.btc_balance * moving.btc_moving_avg_price + abs(t.jpy_amount)) / t.btc_balance END AS btc_moving_avg_price FROM moving JOIN t ON moving.id = (t.id - 1) ) ãã®ããã«ãåã®èšç®çµæãåŒãç¶ãã§æ¬¡ã®èšç®ããããªãå¿
èŠãããå ŽåãWITH RECURSIVEã«ããååž°ã¯ãšãªãåãçºæ®ããŸããäžèšã®èª¬ææã§èšç®ãããããã³ã€ã³ã®å¹³åå䟡ãšãå³10ã«ç€ºãèšç®çµæãäžèŽããŠããããšã確èªããŠã¿ãŠãã ããã å³10. ã³ãŒã9ã®åºåçµæ ãŸãšã å
š8åã®é£èŒãéããŠããããã¯ãã§ãŒã³ã®åºæ¬çãªä»çµã¿ã®è§£èª¬ãšã代衚çãªãããã¯ãã§ãŒã³ã§ãããããã³ã€ã³ãšã€ãŒãµãªã¢ã ã®ããŒã¿æ§é ã®è§£èª¬ãããã³ãSQLãçšãããªã³ãã§ãŒã³ããŒã¿åæã®æŒç¿ããããªããŸãããããããSQLãçšããŠããŒã¿åæã®æè¡ã磚ããã人ã«ãšã£ãŠããããã¯ãã§ãŒã³ã®ãªã³ãã§ãŒã³ããŒã¿ã¯æè»œã«ã¢ã¯ã»ã¹ã§ãããªã¢ã«ãªããŒã¿ãœãŒã¹ãšããŠããããã§ãããŸãããããã¯ãã§ãŒã³ã«é¢ããç¥èãæ·±ããã人ã«ãšã£ãŠããèªåã§SQLãèšè¿°ããªããå®ããŒã¿ãåæããããã»ã¹ã¯éåžžã«æçã§ããæ¬é£èŒãéããŠãèªè
ã®çæ§ãSQLããããã¯ãã§ãŒã³æè¡ã®é
åãçºèŠããäžå©ãšãªãã°å¹žãã§ãã é£èŒäžèЧ ã第1åããããã¯ãã§ãŒã³ãšã¯ ã第2åããããã³ã€ã³ã®ä»çµã¿ ã第3åãã€ãŒãµãªã¢ã ã®ä»çµã¿ ã第4åãããã°ããŒã¿åæã®ããã®SQLåºç€ ã第5åãEthereumããŒã¿åææŒç¿1 ã第6åãEthereumããŒã¿åææŒç¿2 ã第7åãEthereumããŒã¿åææŒç¿3 The post ã第8åãEthereumããŒã¿åææŒç¿4 first appeared on Sqripts .