1078 字
5 分钟
duckdb读取【精简版存款日均查询】
ROLLBACK;
INSTALL excel;LOAD excel;
BEGIN;
--- 自增 indexCREATE SEQUENCE IF NOT EXISTS seq_deposit_id START 1;
--- 建表CREATE TABLE IF NOT EXISTS deposit_fact ( id BIGINT PRIMARY KEY DEFAULT nextval('seq_deposit_id'),
"统计日期" DATE, "客户名称" VARCHAR, "客户编号" VARCHAR, "客户账号名称" VARCHAR, "客户账号" VARCHAR , "币种" VARCHAR,
"存款余额" DECIMAL(38,2), "人民币存款余额" DECIMAL(38,2), "折合美元存款余额" DECIMAL(38,2), "折合人民币存款余额" DECIMAL(38,2), "对公存款账户年日均余额" DECIMAL(38,2), "对公存款账户年日均余额折美元" DECIMAL(38,2), "对公存款账户年日均余额折人民币" DECIMAL(38,2),
"可售产品名称" VARCHAR, "资金用途" VARCHAR, "网点机构编号" VARCHAR, "网点机构中文全称" VARCHAR, "所属支行机构编号" VARCHAR, "所属支行机构中文全称" VARCHAR, "所属二级分行机构编号" VARCHAR, "所属二级分行机构中文全称" VARCHAR,
"客户账号个数" INT,
--- 自动计算列 "客户账号_md5" VARCHAR GENERATED ALWAYS AS ( lower(md5(trim("客户账号"))) ) VIRTUAL,
"余额" DECIMAL(38,2) GENERATED ALWAYS AS ( "人民币存款余额" + "折合人民币存款余额" ) VIRTUAL,
"年日均余额" DECIMAL(38,2) GENERATED ALWAYS AS ( "对公存款账户年日均余额折人民币" ) VIRTUAL);
INSERT INTO deposit_fact ( "统计日期", "客户名称","客户编号","客户账号名称","客户账号","币种", "存款余额","人民币存款余额","折合美元存款余额","折合人民币存款余额","对公存款账户年日均余额","对公存款账户年日均余额折美元","对公存款账户年日均余额折人民币", "可售产品名称","资金用途","网点机构编号","网点机构中文全称","所属支行机构编号","所属支行机构中文全称","所属二级分行机构编号","所属二级分行机构中文全称", "客户账号个数")SELECT --- 日期: yyyy-mm-dd;用 try_strptime 防御脏数据,失败返回 NULL :contentReference[oaicite:9]{index=9} CAST(try_strptime(trim("统计日期"),'%Y-%m-%d') AS DATE) AS "统计日期",
--- 字符串列需要删除前后空白字符 TRIM("客户名称") AS "客户名称", TRIM("客户编号") AS "客户编号", TRIM("客户账号名称") AS "客户账号名称", TRIM("客户账号") AS "客户账号", TRIM("币种") AS "币种",
--- 金额列:先去空格,再去千分位逗号,再 TRY_CAST 成 DECIMAL(精确):contentReference[oaicite:10]{index=10} TRY_CAST(REPLACE(NULLIF(TRIM("存款余额"),''),',','') AS DECIMAL(38,2)) AS "存款余额", TRY_CAST(REPLACE(NULLIF(TRIM("人民币存款余额"),''),',','') AS DECIMAL(38,2)) AS "人民币存款余额", TRY_CAST(REPLACE(NULLIF(TRIM("折合美元存款余额"),''),',','') AS DECIMAL(38,2)) AS "折合美元存款余额", TRY_CAST(REPLACE(NULLIF(TRIM("折合人民币存款余额"),''),',','') AS DECIMAL(38,2)) AS "折合人民币存款余额", TRY_CAST(REPLACE(NULLIF(TRIM("对公存款账户年日均余额"),''),',','') AS DECIMAL(38,2)) AS "对公存款账户年日均余额", TRY_CAST(REPLACE(NULLIF(TRIM("对公存款账户年日均余额折美元"),''),',','') AS DECIMAL(38,2)) AS "对公存款账户年日均余额折美元", TRY_CAST(REPLACE(NULLIF(TRIM("对公存款账户年日均余额折人民币"),''),',','') AS DECIMAL(38,2)) AS "对公存款账户年日均余额折人民币",
--- 其他字符列 TRIM("可售产品名称") AS "可售产品名称", TRIM("资金用途") AS "资金用途", TRIM("网点机构编号") AS "网点机构编号", TRIM("网点机构中文全称") AS "网点机构中文全称", TRIM("所属支行机构编号") AS "所属支行机构编号", TRIM("所属支行机构中文全称") AS "所属支行机构中文全称", TRIM("所属二级分行机构编号") AS "所属二级分行机构编号", TRIM("所属二级分行机构中文全称") AS "所属二级分行机构中文全称",
--- 整数列 TRY_CAST(NULLIF(TRIM("客户账号个数"),'') AS INT) AS "客户账号个数"FROM READ_XLSX('C:\Users\jacf\Desktop\存款\汇总.xlsx',header=true,range='B:W',all_varchar=true);
--- 单列可重复索引CREATE INDEX IF NOT EXISTS idx_deposit_stat_date ON deposit_fact("统计日期");CREATE INDEX IF NOT EXISTS idx_deposit_cust_name ON deposit_fact ("客户名称");CREATE INDEX IF NOT EXISTS idx_deposit_acct ON deposit_fact ("客户账号");CREATE INDEX IF NOT EXISTS idx_deposit_product ON deposit_fact ("可售产品名称");CREATE INDEX IF NOT EXISTS idx_deposit_usage ON deposit_fact ("资金用途");
--- 符合索引CREATE INDEX IF NOT EXISTS idx_deposit_date_acct ON deposit_fact ("统计日期","客户账号");CREATE INDEX IF NOT EXISTS idx_deposit_date_prod ON deposit_fact ("统计日期","可售产品名称");
COMMIT; duckdb读取【精简版存款日均查询】
https://blog.echopath.one/posts/duckdb读取精简版存款日均查询/