title: 06. SQL基础(一) tags: sixdegreelab dune onchain analysis sql transaction SQL基础(一) 基础概念 1、数据仓库是什么? 说人话就是说就是出于数据统计的需要,把一些数据分门别类地存储起来,存储的载体是【数据表】。针对某一个或者一些主题的一系列【数据表】合在一起就是数据仓库。 注意: 这里的数据可以是结果数据(比如Uniswap上线以来某个交易对每天的交易量统计) 也可以是过程数据(Uniswap上线以来某个交易对发生的每一条交易记录明细:谁发起的,用A换B,交易时间,txhash,交易数量….)。 2、SQL是什么?
title: 06. SQL基础(一) tags: - sixdegreelab - dune - onchain analysis - sql - transaction
1、数据仓库是什么?
说人话就是说就是出于数据统计的需要,把一些数据分门别类地存储起来,存储的载体是【数据表】。针对某一个或者一些主题的一系列【数据表】合在一起就是数据仓库。
注意:
这里的数据可以是结果数据(比如Uniswap上线以来某个交易对每天的交易量统计)
也可以是过程数据(Uniswap上线以来某个交易对发生的每一条交易记录明细:谁发起的,用A换B,交易时间,tx_hash,交易数量….)。
2、SQL是什么?
假设你想吃脆香米巧克力,但是你这会儿出不了门,你就叫个跑腿说:我需要一盒巧克力,他的牌子是脆香米。跑腿去了趟超市把巧克力买来送到你家。
类比过来SQL就是你说的那句话,Dune Analytics就是个跑腿儿,他可以让你可以跟数据仓库对话,并且将数据仓库里的数据给你搬出来给你。SQL最基本的结构或者语法就3个模块,几乎所有的SQL都会包含这3个部分:
select: 取哪个字段?
from:从哪个表里取?
where:限制条件是什么?
3、数据表长什么样?
你可以认为表就是一个一个的Excel 表,每一个Excel 表里存的不同的数据。以ethereum.transactions(以太坊上的transactions记录)为例:

顺便说下表里用比较多的几个字段
案例1:我想看看孙哥钱包(0x3DdfA8eC3052539b6C9549F12cEA2C295cfF5296)在2022年1月份以来的每一笔ETH的大额转出(>1000ETH)是在什么时候以及具体的转出数量
select --Select后跟着需要查询的字段,多个字段用英文逗号分隔 block_time ,"from" ,"to" ,hash ,value /power(10,18) as value --通过将value除以/power(10,18)来换算精度,18是以太坊的精度 from ethereum.transactions --从 ethereum.transactions表中获取数据 where block_time > date('2022-01-01') --限制Transfer时间是在2022年1月1日之后 and "from" = 0x3DdfA8eC3052539b6C9549F12cEA2C295cfF5296 --限制孙哥的钱包 and value /power(10,18) >1000 --限制ETH Transfer量大于1000 order by block_time --基于blocktime做升序排列,如果想降序排列需要在末尾加desc

https://dune.com/queries/1523799
案例2:表里都是明细数据,我不想看细节,我只想通过一些统计数据去了解概况
select sum( value /power(10,18) ) as value --对符合要求的数据的value字段求和 ,max( value /power(10,18) ) as max_value --求最大值 ,min( value /power(10,18) ) as min_value--求最小值 ,count( hash ) as tx_count --对符合要求的数据计数,统计有多少条 ,count( distinct to ) as tx_to_address_count --对符合要求的数据计数,统计有多少条(按照去向地址to去重) from ethereum.transactions --从 ethereum.transactions表中获取数据 where block_time > date('2022-01-01') --限制Transfer时间是在2022年1月1日之后 and "from" = 0x3DdfA8eC3052539b6C9549F12cEA2C295cfF5296 and value /power(10,18) > 1000 --限制ETH Transfer量大于1000

https://dune.com/queries/1525555
案例3:我不想只看一个单独的数字,想分小时/天/周来看一下趋势
-- 把粒度到秒的时间转化为天/小时/分钟(为了方便后续按照天或者小时聚合) select --Select后跟着需要查询的字段,多个字段用空格隔开 block_time --transactions发生的时间 ,date_trunc('hour',block_time) as stat_hour --转化成小时的粒度 ,date_trunc('day',block_time) as stat_date --转化成天的粒度 ,date_trunc('week',block_time) as stat_week--转化成week的粒度 ,"from" ,"to" ,hash ,value /power(10,18) as value --通过将value除以/power(10,18)来换算精度,18是以太坊的精度 from ethereum.transactions --从 ethereum.transactions表中获取数据 where block_time > date('2021-01-01') --限制Transfer时间是在2022年1月1日之后 and "from" = 0x3DdfA8eC3052539b6C9549F12cEA2C295cfF5296 and value /power(10,18) >1000 --限制ETH Transfer量大于1000 order by block_time --基于blocktime做升序排列,如果想降序排列需要在末尾加desc

https://dune.com/queries/1527740
select date_trunc('day',block_time) as stat_date ,sum( value /power(10,18) ) as value --对符合要求的数据的value字段求和 from ethereum.transactions --从 ethereum.transactions表中获取数据 where block_time > date('2022-01-01') --限制Transfer时间是在2022年1月1日之后 and "from" = 0x3DdfA8eC3052539b6C9549F12cEA2C295cfF5296 and value /power(10,18) > 1000 --限制ETH Transfer量大于1000 group by 1 order by 1

https://dune.com/queries/1525668

假设上边表格是一个家庭(3个人)2020年前2个月的生活开销明细,如果你只用简单的sum,那你只能得到总计的12900;如果你想的到右边2种统计数据,那就需要用到分组聚合group by(按照【人员】分组聚合或者按照【月份】分组聚合)
案例4:我想从转出ETH的USD金额的角度去看孙哥的转出行为
select block_time ,transactions_info.stat_minute as stat_minute ,"from" ,"to" ,hash ,eth_amount --通过将value除以/power(10,18)来换算精度,18是以太坊的精度 ,price ,eth_amount * price as usd_value from ( select --Select后跟着需要查询的字段,多个字段用空格隔开 block_time ,date_trunc('minute',block_time) as stat_minute --把block_time用date_trunc处理成分钟,方便作为主键去关联 ,"from" ,"to" ,hash ,value /power(10,18) as eth_amount --通过将value除以/power(10,18)来换算精度,18是以太坊的精度 from ethereum.transactions --从 ethereum.transactions表中获取数据 where block_time > date('2022-01-01') --限制Transfer时间是在2022年1月1日之后 and "from" = 0x3DdfA8eC3052539b6C9549F12cEA2C295cfF5296 and value /power(10,18) >1000 --限制ETH Transfer量大于1000 order by block_time --基于blocktime做升序排列,如果想降序排列需要在末尾加desc ) transactions_info left join --讲transactions_info与price_info的数据关联,关联方式为 left join ( --prices.usd表里存的是分钟级别的价格数据 select date_trunc('minute',minute) as stat_minute --把minute用date_trunc处理成分钟,方便作为主键去关联 ,price from prices.usd where blockchain = 'ethereum' --取以太坊上的价格数据 and symbol = 'WETH' --取WETH的数据 ) price_info on transactions_info.stat_minute = price_info.stat_minute --left join关联的主键为stat_minute

https://dune.com/queries/1528027

- join:把两个表按照关联条件(on)关联在一起,取交集 - Table A 跟 Table B通过姓名关联,其中交集是小红和小明,因为join是取交集,因此最终结果里姓名就只有小明和小红 - 两表中所有符合要求的数据都需要关联,因为Table B中小明有2条记录,所以关联的结果中小明也有两条数据 - left join:以左表为主,把右表按照关联条件(on)往左表去关联,如果关联不到就用null填充 - Table A 跟 Table B通过姓名关联,因为是以左表为主,所以尽管左表中小兰和小绿在右表中没有符合关联条件的数据,但是小兰和小绿也会出现在结果中,右表那部分因为关联不到数据,因此都用null填充
with transactions_info as --通过with as 建立子查询命名为transactions_info ( select block_time ,transactions_info.stat_minute as stat_minute ,"from" ,"to" ,hash ,eth_amount --通过将value除以/power(10,18)来换算精度,18是以太坊的精度 ,price ,eth_amount* price as usd_value from ( select --Select后跟着需要查询的字段,多个字段用空格隔开 block_time ,date_trunc('minute',block_time) as stat_minute --把block_time用date_trunc处理成分钟,方便作为主键去关联 ,"from" ,"to" ,hash ,value /power(10,18) as eth_amount --通过将value除以/power(10,18)来换算精度,18是以太坊的精度 from ethereum.transactions --从 ethereum.transactions表中获取数据 where block_time > date('2022-01-01') --限制Transfer时间是在2022年1月1日之后 and "from" = 0x3DdfA8eC3052539b6C9549F12cEA2C295cfF5296 and value /power(10,18) >1000 --限制ETH Transfer量大于1000 order by block_time --基于blocktime做升序排列,如果想降序排列需要在末尾加desc ) transactions_info left join --讲transactions_info与price_info的数据关联,关联方式为 left join ( --prices.usd表里存的是分钟级别的价格数据 select date_trunc('minute',minute) as stat_minute --把minute用date_trunc处理成分钟,方便作为主键去关联 ,price from prices.usd where blockchain = 'ethereum' --取以太坊上的价格数据 and symbol = 'WETH' --取WETH的数据 ) price_info on transactions_info.stat_minute = price_info.stat_minute --left join关联的主键为stat_minute ) select date_trunc('day',block_time) as stat_date ,sum(eth_amount) as eth_amount ,sum(usd_value) as usd_value from transactions_info --从子查询形成的‘虚拟表’transactions_info中取需要的数据 group by 1 order by 1

https://dune.com/queries/1528564