数仓中几个SQL技巧

本文介绍了数仓中SQL的四个实用技巧:日期与期间操作,临时表与Common Table Expression,Aggregation与CASE WHEN结合,以及Window Function在用户访问session分析中的应用。详细阐述了如何利用这些技巧进行数据筛选、留存率分析、消费金额统计及session时间计算,提升数据分析效率。

SQL是大数据从业者的必备技能,大部分的大数据技术框架也都提供了SQL的解决方案。可以说SQL是一种经久不衰、历久弥新的编程语言。尤其是在数仓领域,使用SQL更是家常便饭。本文会分享四个在面试和工作中常用的几个使用技巧,具体包括:

  • 日期与期间的使用

  • 临时表与Common Table Expression (WITH)

  • Aggregation 与CASE WHEN的结合使用

  • Window Function的其他用途

数仓?不就是写写SQL吗…

 

第一:日期与期间的使用

日期与时间段的筛选在工作中是经常被用到的,因为在拉取报表、仪表板和各种分析时,周、月、季度、年度的表现往往是分析需要考量的重点。

时间区段的提取:Extract

  • 语法

-- field可以是day、hour、minute, month, quarter等等
-- source可以是date、timestamp类型
extract(field FROM source)
  • 使用

SELECT extract(year FROM '2020-08-05 09:30:08');   -- 结果为 2020
SELECT extract(quarter FROM '2020-08-05 09:30:08');   -- 结果为 3
SELECT extract(month FROM '2020-08-05 09:30:08');   -- 结果为 8
SELECT extract(week FROM '2020-08-05 09:30:08');   -- 结果为 31,一年中的第几周
SELECT extract(day FROM '2020-08-05 09:30:08');  -- 结果为 5
SELECT extract(hour FROM '2020-08-05 09:30:08');   -- 结果为 9
SELECT extract(minute FROM '2020-08-05 09:30:08');   -- 结果为 30
SELECT extract(second FROM '2020-08-05 09:30:08');   -- 结果为 8

上面可供提取的字段,不同的数据库存在些许的差异。以Hive为例,支持day, dayofweek, hour, minute, month, quarter, second, week 和 year。其中周、月、年使用最为广泛,因为无论是公司内部产品,还是商用的产品所提供的数据后台统计,周报和月报(比如近7天、近30天)最注重表现的周期。

注意:

impala支持:YEAR, QUARTER, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND, EPOCH

Hive支持:day, dayofweek, hour, minute, month, quarter, second, week 和 year

Hive是从Hive2.2.0版本开始引入该函数

周的提取

  • 语法

在按照周的区间进行统计时,需要识别出周一的日期与周日的日期,这个时候经常会用到下面的函数:

next_day(STRING start_date, STRING day_of_week)
-- 返回当前日期对应的下一个周几对应的日期
-- 2020-08-05为周三
SELECT next_day('2020-08-05','MO') -- 下一个周一对应的日期:2020-08-10
SELECT next_day('2020-08-05','TU') -- 下一个周二对应的日期:2020-08-11
SELECT next_day('2020-08-05','WE') -- 下一个周三对应的日期:2020-08-12
SELECT next_day('2020-08-05','TH') -- 下一个周四对应的日期:2020-08-06,即为本周四
SELECT next_day('2020-08-05','FR') -- 下一个周五对应的日期:2020-08-07,即为本周五
SELECT next_day('2020-08-05','SA') -- 下一个周六对应的日期:2020-08-08,即为本周六
SELECT next_day('2020-08-05','SU') -- 下一个周日对应的日期:2020-08-09,即为本周日
-- 星期一到星期日的英文(Monday,Tu
<think>嗯,用户想要获取库建设的速成方法。从对话历史看,用户之前已经看过几个引用资料,包括工业级实时项目实战、据准备工作和据中台相关内容。用户现在明确提出了"速成"这个关键词,说明ta可能面临时间压力或者急需解决实际问题。 用户可能是个刚接触的新手工程师,或者是个需要快速交付项目的中小企业技术负责人。ta的真实需求可能不仅仅是理论上的速成,更希望获得能立即上手的实践方案。考虑到引用中提到的企业案例,用户应该更关注可落地的解决方案而非学术理论。 从专业角度看,建设确实没有真正的"速成"之道,但可以抓重点突破。需要强调几个核心: 首先是明确业务目标,避免过度设计;然后是采用模块化组件快速搭建基础框架;最后要善用云服务和开源工具缩短开发周期。特别要注意提醒用户据质量这个隐形陷阱,很多新手会在这里栽跟头。 上次回复中提到的实时15讲和千亿流量中台课程确实适合用户,不过这次要更突出"快速见效"的部分。应该把技术栈选择放在前面,因为这是启动项目的关键第一步。同时要警告用户避免据孤岛这个常见失败点,这往往是初期架构设计不当造成的。 用户可能没意识到据准备要占70%时间,这点必须强调。可以打个比方:就像装修房子,前期拆改水电的时间远超过后期贴壁纸的时间。需要给出具体的ETL工具推荐,比如Debezium和Flink这类实时处理工具。 最后要控制预期:再"速成"的基础建设也需要2-3个月,但通过云服务可以压缩到周级别完成POC。这个时间框架对用户决策应该很有帮助。 </think>基于企业级实践,以下是我总结的库建设**高效路径**,结合核心环节与速成技巧👇: --- ### **一、速成核心:抓准最小可行架构(MVP)** 1. **目标极简聚焦** - 选取 **1-2个关键业务场景**(如交易分析、用户行为统计),避免大而全 - 示例:电商公司优先构建 `订单主题域`,仅集成订单表、用户表、商品表 *→ 避免陷入复杂建模,快速产出可用报表* 2. **技术栈轻量化** ```mermaid graph LR A[据源] -->|实时采集| B(Kafka) B --> C(Flink实时计算) C --> D(ClickHouse/StarRocks) D --> E(BI工具) ``` - **采集层**:用Debezium实现MySQL CDC,替代Sqoop全量同步 - **计算层**:Flink SQL处理基础聚合(省去Spark集群运维成本) - **存储层**:选MPP引擎(ClickHouse)直接支持宽表查询,跳过传统分层建模 --- ### **二、绕过“据沼泽”的关键操作** 1. **据准备加速术** - **原始据不落地**: Kafka原始日志 → Flink SQL实时清洗 → 直接写入 ```sql CREATE TABLE cleaned_orders AS SELECT order_id, user_id, amount, FROM_UNIXTIME(create_time) AS order_time FROM kafka_orders WHERE amount > 0 -- 过滤无效订单 ``` - **用云端工具替代自建**: AWS Glue(自动爬取元据)+ Athena(即时查询S3)省去ETL开发 2. **模型设计降维打击** | 传统做法 | 速成方案 | 节省成本 | |------------------|-------------------------|----------| | 3NF范式建模 | **宽表模型** | 减少70%关联开发 | | 缓慢变化维处理 | **每日全量快照** | 避免SCD逻辑 | | 分层建设(ODS,DWD,DWS)| **ODS+ADS两层** | 缩短50%链路 | --- ### **三、借力现成解决方案(抄大厂作业)** 1. **直接复用开源模板** - GitHub搜索 `data-warehouse-template`,推荐项目: - [airbyte-data-warehouse-template](https://github.com/airbytehq/quickstarts/tree/main/data-warehouse) - [dbt-labs/jaffle_shop](https://github.com/dbt-labs/jaffle_shop)(含完整示例据+模型) 2. **购买云厂商托管服务** - **阿里云**:DataWorks(据开发)+ MaxCompute(存储计算) *→ 10分钟创建,自动生成据血缘图谱* - **Snowflake**:Zero-copy cloning技术秒级复制生产环境测试 --- ### **四、避坑指南:速成≠敷衍** 1. **必须守住的质量红线** - **据校验脚本**(每个ETL步骤后运行): ```python assert df.groupby("date").count().max() < 1000000, "单日据量异常暴增!" ``` - **监控三板斧**: ① 据到达延迟(Prometheus+AlertManager) ② 主键重复率(每日DQC任务) ③ 指标波动阈值(同比>30%自动告警) 2. **后续扩展性预留** 在MVP阶段就做对两件事: - 所有表字段添加`comment`注释(避免三月后忘含义) - 关键表名遵循`[业务域]_[主题]_v1`(如`finance_order_analysis_v1`) --- ### 下一步行动建议: 1. **环境准备**:在阿里云/AWS申请免费试用账号 2. **快速验证**: - Step1:用Flink SQL连接Kafka模拟实时订单流 - Step2:将聚合结果写入ClickHouse - Step3:用Metabase连接ClickHouse生成看板 *(完整流程可在4小时内跑通)* > 工业级实践表明,遵循MVP原则的团队可在**2周内上线首个模块**(参考华为据中台建设案例)[^1]。重点在于优先解决业务痛点,而非追求架构完美。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值