说人话就是说就是出于数据统计的需要,把一些数据分门别类地存储起来,存储的载体是【数据表】。针对某一个或者一些主题的一系列【数据表】合在一起就是数据仓库。
注意: 这里的数据可以是结果数据 ( 比如 Uniswap 上线以来某个交易对每天的交易量统计 ) 也可以是过程数据 (Uniswap 上线以来某个交易对发生的每一条交易记录明细:谁发起的,用 A 换 B,交易时间,tx_hash,交易数量….)。
假设你想吃脆香米巧克力,但是你这会儿出不了门,你就叫个跑腿说:我需要一盒巧克力,他的牌子是脆香米。跑腿去了趟超市把巧克力买来送到你家。 类比过来 SQL 就是你说的那句话,Dune Analytics 就是个跑腿儿,他可以让你可以跟数据仓库对话,并且将数据仓库里的数据给你搬出来给你。SQL 最基本的结构或者语法就 3 个模块,几乎所有的 SQL 都会包含这 3 个部分:
你可以认为表就是一个一个的 Excel 表,每一个 Excel 表里存的不同的数据。以 ethereum.transactions( 以太坊上的 transactions 记录 ) 为例:
顺便说下表里用比较多的几个字段
案例 1:我想看看孙哥钱包 (0x3DdfA8eC3052539b6C9549F12cEA2C295cfF5296) 在 2022 年 1 月份以来的每一笔 ETH 的大额转出 (>1000ETH) 是在什么时候以及具体的转出数量
Dune Query URL
https://dune.com/queries/1523799
SELECT
SELECT 后边跟着,需要查询的字段,多个字段用英文逗号隔开
FROM
FROM 后边跟着数据来源的表
WHERE
WHERE 后跟着对数据的筛选条件
案例 2:表里都是明细数据,我不想看细节,我只想通过一些统计数据去了解概况
SQL
Dune Query URL
https://dune.com/queries/1525555
聚合函数
案例 3:我不想只看一个单独的数字,想分小时 / 天 / 周来看一下趋势
3.1 把时间戳转化成小时 / 天 / 周的格式,方便进一步做聚合统计
SQL
Dune Query URL
https://dune.com/queries/1527740
语法说明
DATE_TRUNC('datepart', timestamp)
时间戳的截断函数
根据 datepart 参数的不同会得到不同的效果
SQL
Dune Query URL
https://dune.com/queries/1525668
语法说明
分组聚合 (group by)
分组聚合的语法是 group by。分组聚合顾名思义就是先分组后聚合,需要配合聚合函数一起使用。
假设上边表格是一个家庭 (3 个人 )2020 年前 2 个月的生活开销明细,如果你只用简单的 sum,那你只能得到总计的 12900;如果你想的到右边 2 种统计数据,那就需要用到分组聚合 group by(按照【人员】分组聚合或者按照【月份】分组聚合)
案例 4:我想从转出 ETH 的 USD 金额的角度去看孙哥的转出行为
SQL
Dune Query URL
https://dune.com/queries/1528027
联表查询
联表查询有 2 个部分构成
用得最多的联表方式是 join 跟 left join,以这 2 个为例子去解释下具体的用法
join:把两个表按照关联条件 (on) 关联在一起,取交集
left join:以左表为主,把右表按照关联条件 (on) 往左表去关联,如果关联不到就用 null 填充
SQL
Dune Query URL
https://dune.com/queries/1528564
子查询 (with as )
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。