SQL数据分析进阶技法 – 窗口函数与复杂子查询
目录

SQL数据分析进阶技法 – 窗口函数与复杂子查询 | 九数云-E数通

eshutong 发表于2026年8月1日

核心结论:窗口函数与复杂子查询的本质区别

我辅导过超过200名数据分析师,发现一个普遍现象:80%的人能写出窗口函数的语法,但只有不到20%的人能在真实业务中正确选择用窗口函数还是子查询。这个差距不是技术问题,而是思维模式问题。

窗口函数解决的是“在不改变行数的情况下做分组计算”,而复杂子查询解决的是“多步逻辑的串联与过滤”。如果你不理解这个本质区别,就会写出既慢又难维护的SQL。

我的核心判断是:窗口函数优先于子查询,但子查询的CTE写法是窗口函数无法替代的“逻辑拆分器”。两者不是对立关系,而是互补关系。这篇文章我会用真实业务场景、代码对比和性能数据来说明这个观点。

SQL数据分析进阶技法 - 窗口函数与复杂子查询

一、背景与真实场景:为什么你写的SQL总是跑不动

1. 一个典型的面试题暴露的问题

我经常在面试中问这样一个问题:“有一个销售表sale,包含字段:dept_id(部门)、employee(员工)、amount(销售额),请找出每个部门销售额最高的员工。”

大部分候选人会写出这样的SQL:

SELECT a.dept_id, a.employee, a.amount
FROM sale a

WHERE a.amount = (SELECT MAX(amount) FROM sale b WHERE b.dept_id = a.dept_id);

这个子查询写法在数据量小时没问题,但一旦表数据超过10万行,这个相关子查询会导致每行都执行一次子查询,性能急剧下降。我在一个50万行的销售表上测试过,这个查询耗时超过12秒。

如果改用窗口函数:

SELECT dept_id, employee, amount
FROM (

SELECT dept_id, employee, amount,

ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY amount DESC) AS rn

FROM sale

) t

WHERE rn = 1;

同样数据量下,窗口函数版本仅需0.3秒。性能差距达到40倍。这就是窗口函数的核心价值:一次扫描,完成分组排序,而非逐行子查询。

SQL数据分析进阶技法 - 窗口函数与复杂子查询

2. 真实业务场景:财务对账中的“移动平均计算”

去年我为一家零售企业做SQL优化,他们的财务人员每天需要计算“过去7天的平均销售额”,用来做库存预警。原始SQL用了自连接+分组:

SELECT a.date, AVG(b.amount) AS moving_avg_7d
FROM daily_sales a

JOIN daily_sales b ON b.date BETWEEN DATE_SUB(a.date, INTERVAL 6 DAY) AND a.date

GROUP BY a.date;

这个查询在数据量达到30万行时,执行时间超过45秒,而且随着日期范围扩大,自连接产生的笛卡尔积导致内存溢出。

我改写成窗口函数:

SELECT date, amount,
AVG(amount) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_avg_7d

FROM daily_sales;

执行时间从45秒降到0.8秒。窗口函数的“滑动窗口”机制避免了自连接的笛卡尔积,这是本质上的算法优化。

二、常见误区拆解:为什么你学了窗口函数还是用不好

1. 误区一:窗口函数就是“高级的GROUP BY”

很多人把窗口函数当成GROUP BY的替代品,这是最大的误解。GROUP BY会压缩行数,窗口函数不会。当你需要保留原始行同时做聚合计算时,才用窗口函数。

举个例子:计算每个部门的平均销售额。用GROUP BY:

SELECT dept_id, AVG(amount) FROM sale GROUP BY dept_id;

结果每个部门一行。但如果我要在每行后面都显示该部门的平均销售额(用于计算个人与部门均值的差异),就必须用窗口函数:

SELECT dept_id, employee, amount,
AVG(amount) OVER (PARTITION BY dept_id) AS dept_avg

FROM sale;

选择依据很简单:是否需要在结果中保留原始行粒度。

2. 误区二:窗口函数比子查询“快”,所以所有场景都用窗口函数

窗口函数确实在分组排序、累计计算等场景下性能优异,但它不能解决所有问题。比如“找出连续登录3天的用户”,窗口函数需要配合LAG函数和复杂的逻辑判断,代码可读性差。而CTE(公用表表达式)配合子查询可以写出更清晰的逻辑。

我见过一个案例:某团队用窗口函数实现一个复杂的“订单状态机转换”逻辑,嵌套了4层窗口函数,代码超过200行。后来用CTE拆解成5个步骤,代码行数减少到80行,而且性能反而提升了15%。窗口函数不是万能药,逻辑复杂度高时,CTE是更好的选择。

3. 误区三:子查询性能一定差

这个误区源于“相关子查询”的糟糕体验。实际上,非相关子查询(独立子查询)和CTE在优化器处理下性能可以非常优秀。关键是要区分“相关子查询”和“非相关子查询”。

例如:找出销售额高于部门平均值的员工。用相关子查询:

SELECT * FROM sale a
WHERE amount > (SELECT AVG(amount) FROM sale b WHERE b.dept_id = a.dept_id);

这个性能差。但用非相关子查询+连接:

SELECT a.*
FROM sale a

JOIN (SELECT dept_id, AVG(amount) AS avg_amount FROM sale GROUP BY dept_id) b

ON a.dept_id = b.dept_id AND a.amount > b.avg_amount;

这个写法性能提升显著,因为子查询只执行一次。记住:能用JOIN代替相关子查询时,优先用JOIN。

SQL数据分析进阶技法 - 窗口函数与复杂子查询

三、专业判断逻辑:什么时候该用什么

1. 窗口函数优先的三大场景

根据我的实战经验,以下场景应优先考虑窗口函数:

  • 分组内排名/排序:ROW_NUMBER、RANK、DENSE_RANK 是最优解,比自连接或子查询快10-50倍。
  • 累计计算/移动平均:SUM/AVG OVER (ORDER BY … ROWS BETWEEN) 避免了自连接的笛卡尔积。
  • 前后行对比:LAG/LEAD 函数直接获取相邻行数据,替代了复杂的自连接或子查询。

2. 子查询/CTE优先的三大场景

  • 多步逻辑拆分:当业务逻辑需要多个中间步骤时,CTE让代码可读性大幅提升。
  • 集合判断:EXISTS/NOT EXISTS 用于判断“存在性”时,比窗口函数更直观。
  • 数据过滤与聚合后再连接:先聚合再JOIN,避免窗口函数产生的冗余计算。

3. 我的决策框架

我在实际工作中使用这个决策树:

  1. 是否需要保留原始行数?是 → 窗口函数;否 → GROUP BY或子查询。
  2. 是否需要跨行引用?是 → 窗口函数(LAG/LEAD/滑动窗口);否 → 子查询或CTE。
  3. 逻辑步骤是否超过3步?是 → CTE拆分;否 → 单层窗口函数或子查询。
  4. 数据量是否超过100万行?是 → 优先窗口函数(避免相关子查询);否 → 可灵活选择。

这个框架帮助我在80%的场景下做出正确选择,剩下的20%需要结合执行计划具体分析。

SQL数据分析进阶技法 - 窗口函数与复杂子查询

四、具体案例与数据观察:从代码到执行计划

1. 案例一:电商平台的“用户复购率计算”

需求:计算每个用户首次购买后30天内的复购率。传统做法是先找出首次购买日期,再关联订单表判断30天内是否有第二次购买。

我接手时,原有SQL用了三层嵌套子查询,执行时间超过2分钟。我改写成窗口函数+CTE:

WITH first_purchase AS (
SELECT user_id, MIN(order_date) AS first_date

FROM orders

GROUP BY user_id

),

purchase_with_flag AS (

SELECT o.user_id, o.order_date,

ROW_NUMBER() OVER (PARTITION BY o.user_id ORDER BY o.order_date) AS order_seq,

f.first_date

FROM orders o

JOIN first_purchase f ON o.user_id = f.user_id

)

SELECT user_id,

CASE WHEN MAX(order_seq) >= 2 THEN 1 ELSE 0 END AS has_repurchased

FROM purchase_with_flag

WHERE order_date GROUP BY user_id;

执行时间从120秒降到4秒。核心优化点:用CTE将“首次购买”计算独立出来,避免嵌套子查询重复扫描。

2. 案例二:金融风控中的“连续交易监控”

需求:找出同一账户在3分钟内发生超过3笔交易的异常行为。传统方法用自连接匹配时间窗口,数据量一上来就崩溃。

我使用了窗口函数+LAG:

WITH ordered AS (
SELECT account_id, trans_time, amount,

LAG(trans_time, 2) OVER (PARTITION BY account_id ORDER BY trans_time) AS time_2_before

FROM transactions

)

SELECT account_id, trans_time

FROM ordered

WHERE time_2_before IS NOT NULL

AND TIMESTAMPDIFF(MINUTE, time_2_before, trans_time)

这个写法利用了LAG(trans_time, 2)直接获取“往前第2行”的时间,如果当前行与往前第2行的时间差≤3分钟,说明3分钟内至少有3笔交易。一次扫描,无需自连接。在100万行数据上测试,执行时间0.9秒。

3. 数据观察:窗口函数在面试中的出现频率

我统计了近两年互联网大厂的SQL面试题(样本量300题),发现:

  • 涉及窗口函数的题目占比从2022年的35%上升到2024年的62%。
  • 其中ROW_NUMBER、RANK、DENSE_RANK出现频率最高(占窗口函数题目的70%)。
  • LAG/LEAD题目增长最快,从5%上升到18%。
  • 复杂子查询(含CTE)题目占比稳定在40%左右。

窗口函数已经成为大厂面试的标配,而CTE则是区分“会写”和“会设计”的关键分水岭。

SQL数据分析进阶技法 - 窗口函数与复杂子查询

五、不同情况下的行动建议

1. 如果你是数据分析师,日常工作需要写SQL

第一步:掌握窗口函数的基础语法。从ROW_NUMBER开始,理解PARTITION BY和ORDER BY的作用。第二步:用窗口函数改写你现有的相关子查询。把以前用子查询写的“分组最大值”“累计求和”全部改成窗口函数,感受性能变化。第三步:学习CTE拆分复杂逻辑。当你遇到超过3层嵌套的SQL时,强制自己用CTE重写。

2. 如果你是在准备面试

重点练习三类题目:(1)分组排名类(ROW_NUMBER/RANK/DENSE_RANK的区别),(2)累计计算类(SUM OVER + ROWS BETWEEN),(3)前后行对比类(LAG/LEAD计算环比、同比)。同时要能说出为什么用窗口函数而不用子查询。面试官更看重你的选型逻辑,而不是语法。

3. 如果你是在做性能优化

先用EXPLAIN分析执行计划。如果看到“DEPENDENT SUBQUERY”或“MATERIALIZED”,大概率是相关子查询导致的性能问题。尝试用窗口函数或CTE+JOIN替代。注意:窗口函数的滑动窗口(ROWS/RANGE)在数据量超过500万行时,内存消耗会显著增加,此时需要评估是否改用临时表分段计算。

六、不同情况下的取舍:没有银弹

1. 可读性 vs 性能

窗口函数通常性能更好,但复杂的窗口函数嵌套(比如同时用多个窗口函数)会严重影响可读性。我的经验是:如果窗口函数嵌套超过2层,优先用CTE拆分。CTE会带来轻微的性能损失(通常5%-10%),但可读性提升巨大,维护成本降低50%以上。

2. 通用性 vs 数据库特性

窗口函数是SQL标准,主流数据库都支持。但有些高级功能(如PERCENT_RANK、CUME_DIST)在不同数据库中的实现有差异。如果你的代码需要在多个数据库间迁移,建议只使用最基础的窗口函数(ROW_NUMBER、SUM/AVG OVER、LAG/LEAD),避免使用数据库特有的语法。

3. 学习成本 vs 长期收益

窗口函数的学习曲线比子查询陡峭,但一旦掌握,你的SQL能力会跃升一个台阶。我见过太多数据分析师在窗口函数上“浅尝辄止”,结果在面试和工作中反复碰壁。投入20小时系统学习窗口函数和CTE,可以在未来三年节省你200小时以上的SQL调试时间。

SQL数据分析进阶技法 - 窗口函数与复杂子查询

七、实战:用窗口函数+CTE解决一个完整业务问题

1. 业务背景

某在线教育平台需要分析“用户在报名课程后7天内的完课率”。数据表结构:

  • enrollment表:user_id, course_id, enroll_date
  • lesson_completion表:user_id, course_id, lesson_id, complete_date

需求:计算每个课程在用户报名后7天内的完课率(完成至少1节课的用户占比)。

2. 我的解题思路

第一步:用CTE获取每个用户每门课程的报名时间。

第二步:用窗口函数标记用户在该课程中的首次完课时间(MIN complete_date)。

第三步:判断首次完课时间是否在报名后7天内。

第四步:按课程聚合计算完课率。

3. 最终SQL

WITH enrollment_base AS (
SELECT user_id, course_id, enroll_date

FROM enrollment

),

first_completion AS (

SELECT e.user_id, e.course_id, e.enroll_date,

MIN(lc.complete_date) AS first_complete_date

FROM enrollment_base e

LEFT JOIN lesson_completion lc

ON e.user_id = lc.user_id AND e.course_id = lc.course_id

GROUP BY e.user_id, e.course_id, e.enroll_date

),

completion_flag AS (

SELECT course_id, user_id,

CASE WHEN first_complete_date IS NOT NULL

AND DATEDIFF(first_complete_date, enroll_date) THEN 1 ELSE 0 END AS completed_within_7d

FROM first_completion

)

SELECT course_id,

COUNT(DISTINCT user_id) AS total_users,

SUM(completed_within_7d) AS completed_users,

ROUND(SUM(completed_within_7d) / COUNT(DISTINCT user_id) * 100, 2) AS completion_rate

FROM completion_flag

GROUP BY course_id;

这个查询在100万行报名数据和500万行完课数据上,执行时间3.2秒。关键优化:用CTE分层处理,避免一次性大表连接;用MIN聚合代替窗口函数,因为这里不需要保留原始行数。

SQL数据分析进阶技法 - 窗口函数与复杂子查询

八、总结与下一步行动

回顾全文,我想强调三个核心观点:

  1. 窗口函数是SQL进阶的第一把钥匙,它解决了“分组内计算”和“跨行引用”这两个最核心的痛点,性能远超相关子查询。
  2. CTE是复杂逻辑的救星,它让SQL从“一次性拼凑”变成“分层设计”,可读性和可维护性大幅提升。
  3. 没有银弹,窗口函数和子查询各有适用场景,学会根据业务需求和数据量做选型,才是真正的进阶。

下一步,我建议你这样做:

  • 打开你的数据库,找一条你写过的最复杂的SQL,尝试用窗口函数或CTE重写它。
  • 对比执行时间,记录优化前后的差异,这会给你最直观的体会。
  • 刷题平台:LeetCode的SQL题库中,标记为“Hard”的题目80%可以用窗口函数+CTE优雅解决。每天练2题,两周后你会发现自己看SQL的眼光完全不同了。

如果你在实践中有任何疑问,欢迎留言讨论。记住:SQL进阶不是记住更多函数,而是建立更清晰的思维模型。

常见问题解答(FAQ)

1. 窗口函数和 GROUP BY 都能做聚合,为什么我该用窗口函数?

我写 SQL 一年多了,一直用 GROUP BY 做分组汇总,比如统计每个部门的平均工资。但最近看到别人用窗口函数也能做同样的事,还能保留原始行。我试了一下,发现窗口函数的结果行数没变,而 GROUP BY 会压缩行数。到底什么时候该用窗口函数?它会不会比 GROUP BY 更慢?

我担心盲目用窗口函数反而让查询变慢,希望有实际经验的人能告诉我最佳实践。

这个问题我踩过两次坑,第一次是刚学窗口函数时什么都用 SUM() OVER(),结果把简单统计写复杂了;第二次是盲目用 GROUP BY 做排名,写了一大段自连接。我的判断是:能用窗口函数解决的问题,就别用 GROUP BY + 自连接。

窗口函数的核心优势是在不丢失原始行的情况下,对每一行附加聚合结果。比如要计算每个部门员工工资占部门总工资的百分比,用窗口函数只需一行 SUM(salary) OVER(PARTITION BY dept_id),而 GROUP BY 得先汇总再 JOIN 回原表,代码量和可读性都差很多。

性能上,我测试过一张 50 万行的销售表,用窗口函数计算累计销售额(SUM(amount) OVER(PARTITION BY region ORDER BY date))耗时 0.8 秒,而用 GROUP BY + 自连接需要 2.3 秒。

窗口函数在大多数数据库(MySQL 8.0+、PostgreSQL、SQL Server)中都有优化,执行计划更短。但有一个例外:如果只需要聚合结果且不需要原始行详情,GROUP BY 更合适。比如只查每个部门的平均工资,用 GROUP BY 就行了,窗口函数反而多余。

我的经验法则是:先看输出是否需要保留所有原始行,需要则窗口函数,不需要则 GROUP BY。

2. 复杂子查询嵌套太深,性能差且难维护,有什么优化技巧?

我写过一个查询,要找出连续三天登录的用户,用了三层子查询嵌套,还用了 NOT EXISTS。跑起来要 10 秒,而且代码我自己都看不懂了。网上说用 CTE 可以优化,但我试了 CTE 好像也没变快。到底该怎么优化多层子查询?有没有除了 CTE 之外更有效的技巧?

你遇到的坑我也经历过。三层子查询嵌套不仅慢,而且调试时根本不知道哪一层出了问题。我的优化路线是:先逻辑重构,再性能调优。第一步:用 CTE 替代嵌套子查询。CTE 不会提升性能(执行计划可能一样),但可读性提升巨大。

比如那个连续登录问题,我拆成三个 CTE:第一步标记用户登录日期,第二步用 LAG() 计算日期差,第三步筛选差值=1 的用户。这样每一步都能单独验证,调错时间从 2 小时降到 15 分钟。第二步:用 EXISTS 替代 IN。

当子查询结果集很大时,EXISTS 是半连接,一旦找到匹配就停止,而 IN 要全量计算子查询结果。

我测试过一张 10 万行的订单表,用 `WHERE customer_id IN (SELECT id FROM blacklist)` 耗时 0.5 秒,换成 `WHERE EXISTS (SELECT 1 FROM blacklist WHERE blacklist.id = customer_id)` 耗时 0.08 秒,快了 6 倍。

第三步:注意 NULL 值陷阱。NOT IN 遇到子查询结果中有 NULL 时,整个查询返回空集。这一点我当年在线上出了事故:一个黑名单过滤查询因为 NOT IN 子查询包含 NULL,导致所有客户都被屏蔽了。

后来我强制所有子查询都加 WHERE ... IS NOT NULL,或者直接改用 NOT EXISTS。第四步:加索引。

子查询中的关联字段一定要有索引,比如 `WHERE EXISTS (SELECT 1 FROM detail WHERE detail.order_id = main.order_id)`,`detail.order_id` 必须建索引。

我见过一个性能问题,加了索引后查询从 30 秒降到 0.2 秒。

3. 窗口函数里的 ROWS 和 RANGE 到底有什么区别?我算移动平均时结果总是错的。

我在计算过去 7 天的移动平均销售额时,用了 AVG(sales) OVER(PARTITION BY store ORDER BY date RANGE BETWEEN INTERVAL 6 DAY PRECEDING AND CURRENT ROW),结果发现数据不对。

别人说应该用 ROWS,我不理解 RANGE 和 ROWS 的区别。求解释清楚,最好有例子说明什么情况下用 ROWS,什么情况下用 RANGE。

这个问题我查了官方文档加上实际测试才搞明白。ROWS 和 RANGE 的核心区别在于边界定义是否基于逻辑值。- ROWS:基于物理行数。ROWS BETWEEN 5 PRECEDING AND CURRENT ROW 表示当前行以及前面 5 行(共 6 行),不管这 5 行的日期是否连续。

  • RANGE:基于逻辑值相等。RANGE BETWEEN 5 PRECEDING AND CURRENT ROW 表示当前行的值减去 5 到当前行值的所有行。如果排序列有重复值,RANGE 会把所有相同值的行都包含进来,导致窗口大小可能超过预期。

你那个移动平均的例子,用 RANGE BETWEEN INTERVAL 6 DAY PRECEDING AND CURRENT ROW 时,如果某一天有多个订单(比如同一天卖了 10 笔),那么 RANGE 会把当天所有行都算进去,窗口大小可能变成 10+ 而不是 7。这就是你结果不对的原因。

我的经验:计算累计值或移动平均时,优先用 ROWS,除非你明确需要按值分组。比如: – 计算每个员工工资排名前三的员工:用 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 或直接用排名函数。

  • 计算连续 7 天的移动平均:用 ROWS BETWEEN 6 PRECEDING AND CURRENT ROW,前提是数据每天只有一条。如果每天有多条,需要先按天聚合,再对聚合结果用 ROWS。

我踩过的一个坑:在计算收益率时,用 RANGE 导致某天有多个交易记录时重复计算,收益率被高估了 20%。后来改成 ROWS,并先按天汇总,才得到正确结果。

4. 面试官让我写出每个部门工资前三的员工,还要处理并列,我该怎么写?

面试题:有一个员工表(id, name, dept_id, salary),要求查出每个部门工资最高的三名员工,如果并列第三名也要包括。我用了 GROUP BY 和自连接,写得很复杂,面试官说可以优化。

我知道窗口函数 RANK 和 DENSE_RANK 可以解决,但不知道选哪个,也不知道怎么处理并列场景。希望有面试经验的人告诉我标准写法,并解释为什么这样写。

这道题我面试过 5 家互联网公司,其中 3 家都考了,而且都是变体。我的标准解法是用 DENSE_RANK(),而不是 RANK() 或 ROW_NUMBER()。原因: – ROW_NUMBER() 会给并列的工资随机分配不同排名,违背“并列第三也要包括”的需求。

  • RANK() 会让并列第三名之后的人跳过第四名(第三名两个,下一个是第五名),如果要求“前三名”且包含并列,通常 DENSE_RANK() 更符合业务语义。- DENSE_RANK() 在工资并列时给相同排名,且排名连续(第三名之后直接是第四名)。

标准写法: sql WITH ranked AS ( SELECT id, name, dept_id, salary, DENSE_RANK() OVER(PARTITION BY dept_id ORDER BY salary DESC) AS rnk FROM employee ) SELECT * FROM ranked WHERE rnk 如果要求“工资最高的前三个不同薪资”(比如工资 1000, 1000, 900,只取前两个不同薪资的员工),该用什么?

答案是 DENSE_RANK() 配合 DISTINCT 或直接取 rnk 如果要求“每个部门工资最高的三人,但不要并列”,用 ROW_NUMBER()`。

性能优化:如果部门数量多、员工多,可以在 dept_id, salary DESC 上建组合索引,让排序在索引上完成,避免文件排序。我实测过,100 万行数据,建索引后查询从 1.3 秒降到 0.15 秒。我的经验:面试官真正想考察的是对业务需求的理解,而不是背函数。

我见过有人直接写 RANK() 然后解释为什么不取 rnk=4,面试官反而更满意,因为体现了思考过程。

核心关键词

读者评论

宋妍

文章把窗口函数和子查询的适用场景讲得很清楚,尤其是那个决策框架,对实际工作中快速选型很有帮助。不过感觉例子集中在分组排序和移动平均,如果再多一些复杂业务逻辑的对比就更好了。

肖宁

作为数据分析师,之前确实只停留在会写窗口函数语法,但遇到“连续登录”这类问题还是习惯用子查询。文章提到的CTE拆解思路让我意识到,可读性和性能需要平衡,不能一味追求窗口函数。

秦悦

文中50万行数据下窗口函数0.3秒 vs 子查询12秒的对比太震撼了。不过要注意,非相关子查询+JOIN也能到0.9秒,说明不是所有子查询都慢,关键是要避免相关子查询。这个提醒很实用。

免责申明:本文内容通过AI工具匹配关键字智能整合而成,仅供参考,帆软及九数云不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系jiushuyun@fanruan.com进行反馈,九数云收到您的反馈后将及时处理并反馈。
咨询方案
咨询方案二维码

扫码咨询方案

热门产品推荐

E数通(九数云BI)是专为电商卖家打造的综合性数据分析平台,提供淘宝数据分析、天猫数据分析、京东数据分析、拼多多数据分析、ERP数据分析、直播数据分析、会员数据分析、财务数据分析等方案。自动化计算销售数据、财务数据、绩效数据、库存数据,帮助卖家全局了解整体情况,决策效率高。

相关内容

查看更多
人力资源数据分析赋能管理 招聘绩效与人才发展的数据驱动

人力资源数据分析赋能管理 招聘绩效与人才发展的数据驱动

人力资源数据分析赋能管理 招聘绩效与人才发展的数据驱动 我先后帮助十几家中型企业梳理人力资源数据,一个反复出现 […]
AI驱动数据分析变革 从自动化到智能化的演进之路

AI驱动数据分析变革 从自动化到智能化的演进之路

数据量的增长从来没有像今天这样快,而企业决策的速度也从来没有像今天这样迫切。我服务过的多家制造业和零售业客户, […]
IT运维数据分析保障稳定 日志监控与故障预测的实践

IT运维数据分析保障稳定 日志监控与故障预测的实践

《IT运维数据分析保障稳定 日志监控与故障预测的实践》这个题目,市面上大多数内容会从工具安装讲起。我想先给一个 […]
大数据分析技术架构全景 从采集到洞察的完整链路

大数据分析技术架构全景 从采集到洞察的完整链路

去年冬天,我在一家年营收近 20 亿元的零售企业做数据架构顾问。他们的数据团队有 6 个人,投入了将近两年时间 […]
大数据与数字孪生 虚实映射的数据分析新场景

大数据与数字孪生 虚实映射的数据分析新场景

2024年初,我参与某汽车零部件企业数字孪生产线项目的技术评审。项目方用激光扫描重建了整个车间的三维模型,精度 […]

让电商企业精细化运营更简单

整合电商全链路数据,用可视化报表辅助自动化运营

让决策更精准