news 2026/4/18 5:14:15

SQL窗口函数(使用场景)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL窗口函数(使用场景)

1. 常见排名和排序

-- 行号 ROW_NUMBER() OVER (ORDER BY sales DESC) AS rank -- 排名(允许并列) RANK() OVER (ORDER BY sales DESC) AS rank -- 密集排名 DENSE_RANK() OVER (ORDER BY sales DESC) AS dense_rank -- 分位数 NTILE(4) OVER (ORDER BY salary DESC) AS quartile

2. 时间序列分析

-- 移动平均 SELECT date, sales, AVG(sales) OVER ( ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) AS 7_day_avg FROM daily_sales; -- 环比增长 SELECT month, revenue, (revenue - LAG(revenue, 1) OVER (ORDER BY month)) / LAG(revenue, 1) OVER (ORDER BY month) * 100 AS growth_rate FROM monthly_revenue;

3. 累计计算

-- 累计求和 SELECT date, sales, SUM(sales) OVER ( ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS running_total FROM sales; -- 累计百分比 SELECT customer, revenue, revenue / SUM(revenue) OVER () * 100 AS pct_total, SUM(revenue) OVER ( ORDER BY revenue DESC ROWS UNBOUNDED PRECEDING ) * 100.0 / SUM(revenue) OVER () AS cum_pct FROM customers;

4. 数据比较

-- 与前一行比较 SELECT date, temperature, temperature - LAG(temperature, 1) OVER (ORDER BY date) AS diff_prev, LEAD(temperature, 1) OVER (ORDER BY date) - temperature AS diff_next FROM weather_data; -- 与分组内第一行比较 SELECT department, employee, salary, FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary DESC) as top_salary, salary - FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary DESC) as gap_from_top FROM employees;

5. 高级分析场景

-- 会话分析(找出用户连续访问) SELECT user_id, login_time, LAG(logout_time) OVER (PARTITION BY user_id ORDER BY login_time) as prev_logout, CASE WHEN login_time <= LAG(logout_time) OVER (PARTITION BY user_id ORDER BY login_time) THEN 0 ELSE 1 END as is_new_session FROM user_sessions; -- 查找重复记录 SELECT *, ROW_NUMBER() OVER (PARTITION BY email, name ORDER BY created_at) as dup_count FROM users WHERE dup_count > 1; -- 计算留存率 WITH user_activity AS ( SELECT user_id, login_date, MIN(login_date) OVER (PARTITION BY user_id) as first_login, LEAD(login_date) OVER (PARTITION BY user_id ORDER BY login_date) as next_login FROM logins ) SELECT first_login as cohort_date, COUNT(DISTINCT user_id) as cohort_size, COUNT(DISTINCT CASE WHEN next_login = first_login + INTERVAL '1 day' THEN user_id END) as day1_retained FROM user_activity GROUP BY first_login;

6. 复杂业务场景

-- 漏斗分析 WITH funnel AS ( SELECT user_id, MAX(CASE WHEN event = 'view' THEN 1 ELSE 0 END) as viewed, MAX(CASE WHEN event = 'click' THEN 1 ELSE 0 END) as clicked, MAX(CASE WHEN event = 'purchase' THEN 1 ELSE 0 END) as purchased FROM events GROUP BY user_id ) SELECT COUNT(*) as total_users, SUM(viewed) as viewers, SUM(clicked) as clickers, SUM(purchased) as buyers, 100.0 * SUM(clicked) / NULLIF(SUM(viewed), 0) as click_rate FROM funnel; -- 间隔计算 SELECT user_id, event_time, EXTRACT(EPOCH FROM (event_time - LAG(event_time) OVER (PARTITION BY user_id ORDER BY event_time) )) as seconds_since_last_event FROM events;

7. 性能优化技巧

-- 避免自连接 -- 传统方式(需要自连接) SELECT a.id, a.value, MAX(b.value) as max_so_far FROM table a JOIN table b ON a.id >= b.id GROUP BY a.id, a.value; -- 使用窗口函数(更高效) SELECT id, value, MAX(value) OVER (ORDER BY id ROWS UNBOUNDED PRECEDING) as max_so_far FROM table;

最佳实践建议:

  1. 注意性能:窗口函数在大量数据上可能较慢,合理使用分区

  2. 结合索引:ORDER BY子句中的字段建议有索引

  3. 使用FILTER(如果数据库支持):

    AVG(salary) FILTER (WHERE department = 'Sales') OVER () as avg_sales_salary
  4. 明确窗口范围:明确指定ROWS或RANGE避免歧义

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 16:41:14

PowerDMIS使用“尺寸名义公差编辑器”进行批量修改(最常用、最直观)

这是最直接的方法&#xff0c;适用于修改当前激活程序的多个尺寸。 1.打开编辑窗口 &#xff1a; 在程序区点击编辑器2.编辑器——编辑属性选择“尺寸名义公差”3.批量修改 &#xff1a; 名义值 &#xff1a;找到 “名义值” 属性。直接输入新的数值&#xff0c;然后按回车键。…

作者头像 李华
网站建设 2026/4/16 17:08:11

Linux下TensorFlow-GPU环境配置全指南

Linux下TensorFlow-GPU环境配置全指南 在深度学习项目中&#xff0c;一个稳定、高效的GPU训练环境几乎是标配。然而&#xff0c;不少工程师在搭建 TensorFlow-GPU 环境时仍会遭遇“明明步骤都对&#xff0c;却死活跑不起来”的窘境——动态库加载失败、驱动版本不匹配、Python…

作者头像 李华
网站建设 2026/4/17 19:11:08

LobeChat能否发布为PWA?安装到主屏体验

LobeChat 能否发布为 PWA&#xff1f;安装到主屏的完整实践与体验优化 在智能手机充斥日常生活的今天&#xff0c;我们早已习惯了从主屏幕一键启动微信、钉钉或抖音。而当越来越多的 AI 工具以 Web 应用的形式出现时&#xff0c;一个自然的问题浮现&#xff1a;为什么不能像原生…

作者头像 李华
网站建设 2026/4/17 19:08:26

对分布式事务的一点总结

分布式事务实践&#xff1a;从问题到 Seata 解决方案 写在前面 去年我在做一个电商系统重构&#xff0c;把原来的单体应用拆成了订单服务、库存服务、支付服务、积分服务。拆分完成后&#xff0c;遇到了一个头疼的问题&#xff1a;用户下单时&#xff0c;需要同时扣库存、创建…

作者头像 李华
网站建设 2026/4/15 16:32:36

golang学习笔记: 类型

基本类型 1. 布尔类型 var b bool true var flag false // 类型推断2. 数值类型 整数类型 var i int // 平台相关&#xff0c;32或64位 var i8 int8 // -128 ~ 127 var i16 int16 // -32768 ~ 32767 var i32 int32 // -2^31 ~ 2^31-1 var i64 int64 // -2^63 ~ 2…

作者头像 李华
网站建设 2026/4/1 20:09:40

低延迟交互实现原理:LobeChat前端性能优化揭秘

低延迟交互实现原理&#xff1a;LobeChat前端性能优化揭秘 在AI助手逐渐从“能用”走向“好用”的今天&#xff0c;用户早已不再满足于简单的问答响应。他们期待的是类人般的流畅对话体验——打字机式的逐字输出、输入即反馈的界面响应、打开即可见的会话历史。这种“丝滑感”&…

作者头像 李华