Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >告别复杂SQL:数据分析的降维打击

告别复杂SQL:数据分析的降维打击

作者头像
一臻数据
发布于 2024-12-24 08:19:42
发布于 2024-12-24 08:19:42
12400
代码可运行
举报
文章被收录于专栏:一臻数据一臻数据
运行总次数:0
代码可运行

数据分析的世界里,有一把神奇的魔法棒,它能让复杂的分析变得简单,让繁琐的计算变得优雅。它就是窗口函数! 还记得第一次接触窗口函数时的困惑吗?"PARTITION BY是什么?"、"为什么要用ROWS?"、"LAG和LEAD有什么区别?"相信很多数据分析师都有类似的疑问。但当你真正掌握了这个神器,就会发现它就像一位得力助手,帮你轻松应对各种分析场景。 从销售同比分析到用户留存计算,从库存预警到异常订单监控,窗口函数总能提供最优雅的解决方案。本文将带你深入窗口函数的世界,看看这把神奇的魔法棒如何让数据分析变得简单而强大。 准备好了吗?让我们开启这段奇妙的数据分析之旅!

Doris窗口函数的基础知识和应用场景

大数据分析领域,窗口函数已经成为数据分析师手中不可或缺的利器。你是否遇到过需要计算销售同比环比、计算用户留存率、对数据进行分组排名这类分析需求?Apache Doris的窗口函数能够优雅地解决这些复杂的分析场景。

窗口函数是一把双刃剑 - 强大而危险。使用得当,它能帮助我们高效完成复杂的数据分析;使用不当,则可能导致性能问题。让我们深入了解这个强大的分析工具。

Doris的窗口函数设计遵循"大道至简"的理念。它将复杂的分析逻辑抽象为三个核心概念:分区(PARTITION BY)、排序(ORDER BY)和窗口框架。这种设计既保持了功能的强大,又让使用变得简单直观。

看一个真实的业务场景:电商平台需要分析各个商品类别的销售趋势。传统做法需要写复杂的自连接查询,而使用窗口函数只需一个简单的查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT
    i_category,
    year(d_date),
    month(d_date),
    sum(ss_net_paid) as sales,
    lag(sum(ss_net_paid), 1,0) over(
        partition by i_category 
        order by year(d_date), month(d_date)
    ) as last_month_sales
FROM store_sales, date_dim d1, item
WHERE d1.d_date_sk = ss_sold_date_sk 
    AND i_item_sk = ss_item_sk
GROUP BY i_category, year(d_date), month(d_date);

这个查询优雅地完成了按商品类别计算环比销售额的需求。窗口函数的魅力在于,它让复杂的分析变得简单明了。

Doris的窗口函数执行采用"分而治之"的策略。先对数据进行分区和排序,再在每个分区内滑动窗口进行计算。这种设计既保证了计算的正确性,又能充分利用数据的物理分布特性提升性能。

窗口函数最常见的应用场景包括:

  • 计算同比环比增长
  • 用户留存分析
  • 销售排名统计
  • 累计汇总计算
  • 移动平均计算

在使用窗口函数时,需要注意几个关键点:

窗口框架的设置至关重要。在计算移动平均时,使用ROWS还是RANGE会产生不同的结果。ROWS基于物理行数,RANGE基于值范围,选择要根据实际业务需求。

排序的唯一性决定结果的稳定性。如果ORDER BY的值存在重复,每次查询可能得到不同的结果。建议在排序条件中加入能确保唯一性的列。

分区大小会影响性能。过大的分区会导致内存压力,建议通过合理设置分区键来控制单个分区的数据量。

Doris窗口函数高级特性与优化实践

在业务开发中,我发现很多开发者对窗口函数的认知还停留在简单的ROW_NUMBER()和LAG()使用上。实际上,Doris的窗口函数远比这强大。让我们通过一些实战案例来揭秘它的高级特性。

深度解析NTILE函数

NTILE函数堪称数据分析中的"黄金分割刀"。它能将数据平均切分成N份,非常适合做用户分层、商品分级等分析。

假设我们需要将商品按销售额分为四个等级,传统做法需要先计算分位数再进行分组。使用NTILE,一个查询就能搞定:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT i_category, 
       i_class,
       sum(ss_net_paid) as sales,
       CASE NTILE(4) OVER (ORDER BY sum(ss_net_paid) DESC)
           WHEN 1 THEN '金牌'
           WHEN 2 THEN '银牌'
           WHEN 3 THEN '铜牌'
           ELSE '普通'
       END as level
FROM store_sales, item
WHERE i_item_sk = ss_item_sk
GROUP BY i_category, i_class;

窗口函数性能优化

窗口函数的性能优化是一门艺术。通过多年的实践,我总结出以下几个关键优化点:

1.分区设计优化

分区设计直接影响窗口函数的计算效率。分区过大会导致内存压力,过小则失去了并行计算的优势。

比如计算用户最近7天的活跃度时,可以按用户ID范围分区:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT user_id,
       count(*) OVER (
           PARTITION BY user_id DIV 10000 -- 每个分区约1万用户
           ORDER BY dt 
           ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
       ) as active_days
FROM user_actions;

2.数据分布优化

窗口函数的计算依赖数据的物理分布。合理利用Doris的分桶设计,可以大幅提升性能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE sales_detail (
    shop_id INT,
    dt DATE,
    amount DECIMAL(10,2)
) DISTRIBUTED BY HASH(shop_id)
BUCKETS 32; -- 建议1~10G一个bucket

这样设计后,同一个shop_id的数据会落在同一个分片,计算shop维度的窗口函数时就能避免数据重分布。

3.内存控制优化

窗口函数计算过程中会缓存窗口内的数据。对于大窗口的计算,很容易出现OOM。可以通过控制窗口大小来优化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 优化前
sum(amount) over(partition by shop_id order by dt)

-- 优化后
sum(amount) over(
    partition by shop_id 
    order by dt 
    rows between 90 preceding and current row
)

4.并行计算优化

Doris会将窗口函数的计算任务下推到BE节点并行执行。合理设置并行度可以提升性能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- demo
SET parallel_fragment_exec_instance_num = 8;

典型应用案例

1.用户行为分析

分析用户连续登录天数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT user_id, 
       login_date,
       count(*) over(
           partition by user_id, date_sub(login_date, row_number() over(partition by user_id order by login_date))
           ) as consecutive_days
FROM user_logins;

2.销售业绩分析

计算销售额占比并进行排名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT salesperson_id,
       amount,
       amount / sum(amount) over() as contribution,
       rank() over(order by amount desc) as rank
FROM sales_records;

3.库存预警分析

计算商品的库存消耗速度:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT sku_id,
       stock_date,
       stock_qty,
       (stock_qty - lag(stock_qty, 7, 0) over(partition by sku_id order by stock_date)) / 7 as daily_consumption
FROM inventory_records;

数据分析是一门"艺术",而窗口函数就是这门艺术中最精妙的笔触之一。它不仅能帮我们优雅地解决复杂的分析需求,还能通过各种优化技巧实现高效的计算。相信未来会有更多创新应用涌现。

下期,我们将一起探讨Doris其它更有趣有用有价值的内容,敬请期待!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一臻数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Doris聚合多维分析:让你的数据会"说话",让数据更懂业务的艺术
互联网行业里流传着这样一句话:"数据分析就像是给企业装上了一双透视眼,而其维度层级决定视力好坏"。2024年,随着数字化转型的深入,企业对数据分析的需求越发迫切。传统的单维度分析已经无法满足复杂的业务场景,多维分析正成为数据分析的主流选择。
一臻数据
2024/12/24
1930
Doris聚合多维分析:让你的数据会"说话",让数据更懂业务的艺术
热门数据分析面试题。
Sql中有一类函数叫聚合函数,比如count、sum、avg、min、max等,这些函数的可以将多行数据按照规整聚集为一行,一般聚集前的数据行要大于聚集后的数据行。而有时候我们不仅想要聚集前的数据,又想要聚集后的数据,这时候便引入了窗口函数。
张俊红
2019/09/08
7970
SQL 进阶指南:掌握这些高阶技巧,让你的数据分析快人一步!
你以为 SQL 只是简单的 SELECT * FROM table?那你可就大错特错了! 在这个数据驱动的时代,真正的高手早已抛弃低效的查询方式,玩转窗口函数、递归 CTE、动态透视表,甚至用近似计算让百亿级数据秒出结果! 还在为 SQL 运行慢、分析难、报表卡死而苦恼? 别担心,这篇文章带你深入 SQL 世界,从业务思维出发,手把手拆解 用户增长、行为分析、订单转化、留存率 等核心场景,让你的数据分析能力直接起飞!
睡前大数据
2025/03/25
980
SQL 进阶指南:掌握这些高阶技巧,让你的数据分析快人一步!
这可能是最适合解决 SQL 数据分析痛点的编程语言
数据分析师的日常离不开各种数据操作,过滤、分组、汇总、排序……,面对这些基本需求,SQL 用起来确实得心应手。比如,查个用户分组销售额、筛选一批重要客户,这样的任务用 SQL 写出来就像英语一样简单,迅速搞定:
朱迪
2024/12/16
1210
大数据学习之数据仓库代码题总结上
请编写 SQL 查询,计算从注册当天开始的每个用户在注册后第1天、第3天、第7天的学习留存率。留存率的计算方式是在注册后的特定天数内继续学习的用户数除以当天注册的用户总数。结果应包含日期、留存天数和留存率。
bxia的厨房_公众号
2024/03/05
2551
大数据学习之数据仓库代码题总结上
2021年数据科学家面试:4个基本SQL窗口函数介绍以及示例
墨墨导读:在数据科学家岗位的面试中,窗口函数(WINDOW function)是SQL函数家族中经常会被问到的主题。在本文中,我会根据面试的问题,问题模式和解决问题的基本策略向你展示一些典型的窗口函数,并提供一些示例的分步解决方案。
数据和云
2021/03/09
1.2K0
2021年数据科学家面试:4个基本SQL窗口函数介绍以及示例
Excel 后,我们需要怎样的数据分析软件
在现代商业环境中,数据分析已成为企业决策的重要工具。通过数据分析,企业可以更好地了解市场趋势、客户行为以及内部运营情况,从而制定出更科学的策略,提高竞争力。然而,数据分析并不是一项简单的任务,需要选择合适的工具和方法。
朱迪
2025/03/18
760
SQL数据分析实战:好用的窗口函数
感觉这个春节假期在除夕过完之后吧,时间就过的非常快了,余额已经明显不足了。嗯,是开始可以学习起来了!
可以叫我才哥
2022/04/12
7860
SQL数据分析实战:好用的窗口函数
数据分析人员需要掌握SQL到什么程度?3个常考题目刷一刷
在数据类岗位招聘过程中,经常会考察求职者的SQL能力,这里整理了3个常考的SQL数据分析题,按照由简单到复杂排序,一起来测试一下你掌握了么?
博文视点Broadview
2022/01/21
7770
数据分析人员需要掌握SQL到什么程度?3个常考题目刷一刷
深入MySQL窗口函数:原理和应用
窗口函数(Window Functions)是SQL标准中的一个高级特性,它允许用户在不改变查询结果集行数的情况下,对每一行执行聚合计算或其他复杂的计算。这些计算是基于当前行与结果集中其他行之间的关系进行的。窗口函数特别适用于需要执行跨多行的计算,同时又想保持原始查询结果集的行数不变的场景。
公众号:码到三十五
2024/03/19
2.9K0
深入MySQL窗口函数:原理和应用
DM达梦数据库分析函数整理
在复杂的数据分析场景中,达梦数据库的分析函数扮演着至关重要的角色。它们允许用户在单个查询中对数据进行分组、排序、排名及聚合计算,极大地提升了数据分析的灵活性和效率。本篇将深入探讨达梦数据库中几种关键的分析函数,并通过具体案例SQL来解析其用法,帮助你更好地掌握这些强大的工具。
用户11147438
2024/07/02
1K0
MySQL数据库,从入门到精通:第十八篇——MySQL 8新特性全解析
MySQL从5.7版本直接跳跃发布了8.0版本,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQL Optimizer优化器进行了改进。不仅在速度上得到了改善,还为用户带来了更好的性能和更棒的体验。
默 语
2024/11/20
6720
MySQL数据库,从入门到精通:第十八篇——MySQL 8新特性全解析
数据库:SQL 窗口函数知识介绍
窗口函数(Window Function) 是 SQL2003 标准中定义的一项新特性,并在 SQL2011、SQL2016 中又加以完善,添加了若干处拓展。窗口函数不同于我们熟悉的普通函数和聚合函数,它为每行数据进行一次计算:输入多行(一个窗口)、返回一个值。在报表等分析型查询中,窗口函数能优雅地表达某些需求,发挥不可替代的作用。
小明互联网技术分享社区
2021/05/14
7560
数据库:SQL 窗口函数知识介绍
mysql中分组排序_oracle先分组后排序
​ 窗口函数(window functions),也被称为 “开窗函数”,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可对数据库数据进行实时分析处理。它是数据库的标准功能之一,主流的数据库比如Oracle,PostgreSQL都支持窗口函数功能,MySQL 直到 8.0 版本才开始支持窗口函数。
全栈程序员站长
2022/11/10
8.1K0
"氮气加速器"- 同步物化视图,让查询速度"飞"起来
深夜凌晨两点,数据工程师小张还在加班处理各种复杂的数据分析需求。"这个查询速度也太慢了,都等了半天了还没出结果..." 他揉了揉疲惫的双眼,忍不住吐槽。这不,又收到产品经理的"红色感叹号"消息:"那个实时大屏怎么又卡住了?"
一臻数据
2024/12/24
620
"氮气加速器"- 同步物化视图,让查询速度"飞"起来
数据仓库开发 SQL 使用技巧总结
作者:dcguo 使用 sql 做数仓开发有一段时间了,现做一下梳理复盘,主要内容包括 sql 语法、特性、函数、优化、特殊业务表实现等。 mysql 数据结构 常用 innodb 存储为 B+ 树 特点 多路平衡树,m 个子树中间节点就包含 m 个元素,一个中间节点是一个 page(磁盘页) 默认 16 kb; 子节点保存了全部得元素,父节点得元素是子节点的最大或者最小元素,而且依然是有序得; 节点元素有序,叶子节点双向有序,便于排序和范围查询。 优势 平衡查找树,logn 级别 crud; 单一节点比二
腾讯技术工程官方号
2022/07/19
3.3K0
数据仓库开发 SQL 使用技巧总结
SQL系列(一)快速掌握Hive查询的重难点
作为一名数(取)据(数)分(工)析(具)师(人),不得不夸一下SQL,毕竟凭一己之力养活了80%的数据分析师,甚至更多。SQL语言短小精悍,简单易学,而且分析师重点只关注查询,使得学习成本和时间成本瞬间就下来了。
HsuHeinrich
2023/02/24
3.2K0
SQL系列(一)快速掌握Hive查询的重难点
面试官最爱问:Doris如何通过表模型设计提升查询性能100倍?
刚接手一个数据分析项目,面对纷繁复杂的业务需求,一筹莫展 - 是选择明细模型保留所有原始数据,还是用聚合模型提升查询性能?数据需要更新时,又该如何选择合适的主键模型?
一臻数据
2024/12/24
2230
面试官最爱问:Doris如何通过表模型设计提升查询性能100倍?
SQL 窗口函数的优化和执行
窗口函数(Window Function)是 SQL2003 标准中定义的一项新特性,并在 SQL2011、SQL2016 中又加以完善,添加了若干处拓展。窗口函数不同于我们熟悉的普通函数和聚合函数,它为每行数据进行一次计算:输入多行(一个窗口)、返回一个值。在报表等分析型查询中,窗口函数能优雅地表达某些需求,发挥不可替代的作用。
SQL数据库开发
2024/04/24
2280
SQL 窗口函数的优化和执行
Hive常用窗口函数实战
本文介绍了Hive常见的序列函数,排名函数和窗口函数。结合业务场景展示了Hive分析函数的使用
Eights
2020/07/13
2.8K0
推荐阅读
相关推荐
Doris聚合多维分析:让你的数据会"说话",让数据更懂业务的艺术
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验