京公网安备 11010802034615号
经营许可证编号:京B2-20210330
SQL是数据从业者最基础也最高频的工具。很多人学过SELECT、WHERE、GROUP BY,但一到真实业务里就写不出有效查询——问题不在语法,而在于不知道"业务问题该翻译成哪种查询结构"。
本文围绕电商数据分析中最常见的几类真实问题,逐一给出可直接套用的SQL实例。每个案例都包含业务场景、问题描述、完整SQL写法和结果解读。掌握这些实例背后的思维方式,遇到类似问题就能快速套用。
所有示例基于经典的三张业务表:users(用户表)、orders(订单表)、order_items(订单明细表)。
这是SQL面试和业务分析中最高频的一类问题:查询每个部门工资最高的员工。换成电商场景就是:查询每个品类下销售额最高的商品。
-- 每个品类下销售额排名前3的商品
SELECT category, product_name, total_amount
FROM (
SELECT
category,
product_name,
SUM(amount) AS total_amount,
ROW_NUMBER() OVER (
PARTITION BY category
ORDER BY SUM(amount) DESC
) AS rn
FROM order_items
GROUP BY category, product_name
) t
WHERE rn <= 3;
窗口函数里有三个长得像但用法不同的排名函数,业务中经常搞混:
| 函数 | 特点 | 适用场景 |
|---|---|---|
ROW_NUMBER() |
即使并列也强制编号1,2,3 | 需要严格取前N条,如取前3名 |
RANK() |
并列占名次,下一名跳号(1,1,3) | 比赛排名、允许并列 |
DENSE_RANK() |
并列不跳号(1,1,2) | 等级划分、分档统计 |
用户留存分析中最经典的问题:找出连续登录3天及以上的用户。这个问题考察的是"日期差法"这种经典技巧。
WITH login_dates AS (
-- 先去重,每个用户每天只算一次登录
SELECT DISTINCT user_id, login_date
FROM user_logins
),
grouped AS (
SELECT
user_id,
login_date,
-- 关键技巧:日期减去行号,连续日期会得到相同的值
DATE_SUB(
login_date,
INTERVAL ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY login_date
) DAY
) AS date_group
FROM login_dates
)
SELECT user_id, COUNT(*) AS consecutive_days
FROM grouped
GROUP BY user_id, date_group
HAVING COUNT(*) >= 3;
这个方法的精髓是:把连续的日期序列减去一个递增的行号,连续日期会"坍缩"成同一个分组值。比如日期序列 7-1,7-2,7-3 减去行号 1,2,3,结果都是 6-30。不连续的日期就会落入不同分组,再按分组计数就能找出连续段。
电商分析的核心问题之一:用户从"浏览商品"到"加入购物车"到"提交订单"到"支付成功",每一步的转化率是多少?
SELECT
COUNT(DISTINCT CASE WHEN event = 'view' THEN user_id END) AS step_view,
COUNT(DISTINCT CASE WHEN event = 'cart' THEN user_id END) AS step_cart,
COUNT(DISTINCT CASE WHEN event = 'order' THEN user_id END) AS step_order,
COUNT(DISTINCT CASE WHEN event = 'pay' THEN user_id END) AS step_pay
FROM user_events
WHERE event_date BETWEEN '2024-01-01' AND '2024-01-31';
查出来四个数之后,转化率就是:
条件聚合(CASE WHEN + COUNT DISTINCT)是做漏斗、做行列转换、做"在一行里看多列指标"的核心技巧,比多次JOIN子查询高效得多。
每个月的销售额出来后,要算本月比上月增长多少(环比)、本月比去年同月增长多少(同比)。
WITH monthly_sales AS (
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
SUM(amount) AS sales
FROM orders
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
)
SELECT
month,
sales,
-- 环比:和上一个月比
ROUND(
(sales - LAG(sales) OVER (ORDER BY month))
/ LAG(sales) OVER (ORDER BY month) * 100, 2
) AS mom_growth_pct,
-- 同比:和去年同月比(隔12行)
ROUND(
(sales - LAG(sales, 12) OVER (ORDER BY month))
/ LAG(sales, 12) OVER (ORDER BY month) * 100, 2
) AS yoy_growth_pct
FROM monthly_sales
ORDER BY month;
LAG(列, 1),同比用 LAG(列, 12)(按月数据)。NULLIF() 包一下。经常遇到这种问题:统计每个品类的销售额占全店总销售额的比例。
SELECT
category,
SUM(amount) AS category_sales,
ROUND(
SUM(amount) / SUM(SUM(amount)) OVER () * 100,
2
) AS sales_ratio_pct
FROM order_items
GROUP BY category;
注意 SUM(SUM(amount)) OVER () 这种"嵌套聚合 + 窗口函数"的写法:内层 SUM(amount) 是按品类聚合,外层 SUM(...) OVER () 是在聚合结果上再求全局总和。这种写法比"子查询查总数再相除"简洁得多,是写占比、排名、累计占比的标准模式。
原始数据是长表(每行一个事件),要转成宽表(每个用户一行,列出各行为次数):
原始表:
| user_id | event_type | cnt |
|---|---|---|
| 1001 | view | 10 |
| 1001 | cart | 3 |
| 1002 | view | 8 |
要变成:
| user_id | view_cnt | cart_cnt | order_cnt |
|---|---|---|---|
| 1001 | 10 | 3 | 1 |
SELECT
user_id,
SUM(CASE WHEN event_type = 'view' THEN cnt ELSE 0 END) AS view_cnt,
SUM(CASE WHEN event_type = 'cart' THEN cnt ELSE 0 END) AS cart_cnt,
SUM(CASE WHEN event_type = 'order' THEN cnt ELSE 0 END) AS order_cnt
FROM user_events_summary
GROUP BY user_id;
行列转换是报表宽表、数据脱敏、特征工程里天天用的操作,记住"CASE WHEN + 聚合"这个万能模板即可。
做完这些实例,可以提炼出几条通用的SQL思维方法:
第一,先分层,再写SQL。 复杂查询不要一次性写到底,用CTE(WITH子句)把问题拆成几步:先清洗、再聚合、最后计算。每一层只做一件事,可读性和可调试性都大幅提升。
第二,善用窗口函数替代自连接。 排名、连续问题、环比同比、占比,这些场景用窗口函数写通常比自连接、多层子查询简洁一个数量级。窗口函数是现代SQL最值得掌握的武器。
第三,聚合方向想清楚。 写GROUP BY之前先问自己:我要的是"每个分组一条结果",还是"每条原始行都带聚合值"?前者用GROUP BY,后者用窗口函数。
第四,性能敏感时先看执行计划。 大表JOIN、全表扫描、函数包裹索引列导致索引失效,这些问题靠看不出来,要 EXPLAIN 一下执行计划。
SQL不是背语法,而是训练一种"结构化思维"——把一个模糊的业务问题,拆成明确的表、明确的字段、明确的聚合逻辑。本文列出的六个场景——分组TopN、连续登录、漏斗转化、同环比、占比、行列转换——覆盖了电商数据分析中80%以上的日常查询。把这些实例理解透、能默写,再遇到新问题时,往往只需要在这些模板上换字段、换条件即可。
真正的SQL高手不是会写最复杂的嵌套语句,而是能用最简洁的查询解决业务问题。从实例中提炼模式,再用模式去解新题,这就是SQL应用能力的进阶路径。

一、为什么要通过实例学SQL SQL是数据从业者最基础也最高频的工具。很多人学过SELECT、WHERE、GROUP BY,但一到真实业务里就写不 ...
2026-10-20excel常见函数 一、8个核心数据清洗函数 1. TRIM:一键清除多余空格(最常用) 作用:仅保留文本中"单词/字符之间的1个空格", ...
2026-10-20会计岗位的“通用技能”常被说得太泛。更实用的界定是两层:一层是跨岗位可迁移的能力,比如沟通、业务理解、数据呈现;另一层是 ...
2026-10-20核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-10-20一、为什么指标体系需要"先定义、后建设" 在企业数据治理和数据分析实践中,几乎每个团队都遇到过这样的场景:业务部门说"这个月 ...
2026-10-19一、为什么需要客户分群 在用户运营和客户关系管理中,最忌讳的就是"一刀切"——对所有客户发同样的券、推同样的活动、说同样的 ...
2026-10-19????点击领取《数智化数据分析与 AI 应用实践营(体验课)》 【北京/远程】数智化数据分析与 AI 应用实践营将于11 月 14 日开课 ...
2026-10-19CDA数据分析师 出品 作者:李诗怡 题目1 一家餐厅统计顾客的性别、年龄、消费金额等信息,在进行数据分析时,发现性别这一变量在 ...
2026-10-16核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-10-16核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-10-16一、为什么要区分这两种分布 在数据分析和统计学中,拿到一组数据后第一件事通常就是看它的分布形态。分布形态决定了你能用什么 ...
2026-10-15一、问题现象 在实际使用 Excel 透视表做数据分析时,经常会遇到这样的情况:数据源表格里明明新增了一行或一列金额数据,数据源 ...
2026-10-15核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-10-15一、什么是预测式发货 预测式发货(Anticipatory Shipping)是亚马逊于2013年12月获得授权的一项美国专利(专利号 US 8,615,473 ...
2026-10-14一、SQL在金融量化体系中的定位 量化投资的本质是用数据驱动决策,而数据处理贯穿量化研究的全生命周期。从原始行情数据清洗、因 ...
2026-10-14核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-10-14CDA数据分析师 出品 作者:李诗怡 四层结构 · 零件与房子 · 六大易错点 一、什么是指标体系 定义:指标体系是整套完整框架 ...
2026-10-13写在开头 先还原一个你大概率见过的场面。 立项会上有人说:我们得做用户画像。 于是团队关进会议室,白板写满便利贴,两小时后 ...
2026-10-13 很多数据分析师每天都在计算指标、制作报表,但当被问到“什么叫指标数据元”“指标数据标准包含哪些核心维度”“指标数据质 ...
2026-10-13在统计学与数据分析研究中,相关性分析分为数值变量分析与分类变量分析两大类。针对身高、销量、分数等连续数值变量,通常采用皮 ...
2026-10-12