1078 字
5 分钟
duckdb读取【精简版存款日均查询】
ROLLBACK;
INSTALL excel;
LOAD excel;
BEGIN;
--- 自增 index
CREATE 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读取精简版存款日均查询/
作者
Lucien Noir
发布于
2026-04-02
许可协议
CC BY-NC-SA 4.0