用SQL语句查询累计值

表 t
day qty
1   4
2   1
3   7
SELECT t1.day,
(SELECT SUM(t2.qty) FROM t AS t2
 WHERE t2.day <= t1.day) as acqty -- 累计数量
FROM t AS t1
查询结果
day qty
1   4
2   5
3   12

转载于:https://www.cnblogs.com/JoeDZ/archive/2009/06/26/1511660.html

<think>好的,我现在需要帮助用户查找关于复杂SQL查询的技巧和示例。用户明确提到了优化技巧和示例,所以我要结合之前的引用内容来整理相关信息。 首先,回顾用户提供的引用资料。引用[1]到[5]都涉及SQL的高级技巧,比如窗口函数、递归查询、子查询优化、索引管理、数据透视表、复杂聚合和分组等。其中,引用[3]详细讨论了子查询优化方法,引用[4]提到了分批提交和案例实践,引用[5]强调了减少磁盘I/O的重要性。 用户需要的是复杂查询的示例和优化技巧,所以应该分两部分来组织内容。示例部分可以包括窗口函数、递归查询、数据透视表等,而优化技巧则涉及子查询优化、索引管理、分页优化等。 要注意用户提到的系统级指令,比如数学公式用$...$,独立公式用$$...$$,但在这个问题中可能用不上,但需要确保回答结构清晰,使用中文,并生成相关问题。另外,引用标识要自然地添加在引用的段落末尾。 现在开始整理复杂查询的示例。例如,引用[1]中的窗口函数可以用来做排名和累计计算,引用[2]中的多种联接操作,引用[3]的子查询优化方法,引用[4]的分批提交事务,引用[5]的索引优化。需要将这些内容具体化为示例,比如展示窗口函数的SQL代码,递归查询处理树形结构,数据透视表的CASE WHEN实现。 接下来是优化技巧部分。根据引用[3],子查询优化可以用JOIN代替,避免关联子查询,使用WITH ROLLUP等。引用[5]提到减少磁盘I/O,所以索引的使用很重要。分页优化可以用游标或延迟关联,引用[4]中的分批处理也是优化点。此外,执行计划分析和避免过度使用临时表也是关键点。 需要确保每个技巧都有对应的示例或解释,并正确标注引用来源。例如,在讲子查询优化时,提到使用JOIN替换子查询,并引用[3]。在索引管理部分,引用[5]关于磁盘I/O的内容。 生成的相关问题需要围绕用户的需,可能包括如何选择窗口函数、递归查询的应用场景、子查询优化的具体方法、索引设计原则等,这些都是在回答中提到的内容,可以自然延伸出来。 最后检查是否符合格式要,没有使用任何markdown,代码块用三个反引号包裹,引用标识正确,结构清晰,分点列出,并且语言口语化。确保没有遗漏用户的需点,覆盖复杂查询的示例和优化技巧,并正确引用提供的资料。</think>以下关于复杂SQL查询的示例和优化技巧整理自多个权威技术文档,结合了实际应用场景的最佳实践: ### 一、复杂查询典型示例 1. **窗口函数实现动态排名** ```sql SELECT employee_id, salary, RANK() OVER (ORDER BY salary DESC) as rank, AVG(salary) OVER (PARTITION BY department_id) as dept_avg FROM employees WHERE hire_date > '2020-01-01'[^1] ``` *应用场景:计算销售团队业绩排名时,可动态展示每个销售员的业绩排名和所在部门的平均业绩* 2. **递归查询处理树形结构** ```sql WITH RECURSIVE org_tree AS ( SELECT id, name, parent_id, 1 as level FROM organization WHERE parent_id IS NULL UNION ALL SELECT o.id, o.name, o.parent_id, ot.level + 1 FROM organization o JOIN org_tree ot ON o.parent_id = ot.id ) SELECT * FROM org_tree[^1] ``` *特别适用于组织架构、分类目录等层级数据的深度遍历查询* 3. **数据透视表实现行列转换** ```sql SELECT product_type, SUM(CASE WHEN quarter = 'Q1' THEN sales END) as Q1, SUM(CASE WHEN quarter = 'Q2' THEN sales END) as Q2 FROM sales_data GROUP BY product_type[^4] ``` *常用于将时间序列数据转换为横向对比报表* ### 二、核心优化技巧 1. **子查询优化策略** - 使用JOIN改写关联子查询 ```sql -- 优化前 SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE status = 'VIP') -- 优化后 SELECT o.* FROM orders o JOIN customers c ON o.customer_id = c.id WHERE c.status = 'VIP'[^3] ``` - 对子查询结果集建立临时索引 ```sql CREATE INDEX tmp_idx ON (SELECT id FROM large_table WHERE condition)[^3] ``` 2. **索引优化原则** - 复合索引遵循最左前缀匹配原则 - 对WHERE、JOIN、ORDER BY涉及的列优先建立索引 - 使用覆盖索引减少回表操作[^5] 3. **分页查询优化** ```sql -- 传统分页 SELECT * FROM logs ORDER BY create_time LIMIT 10000, 20 -- 优化方案(游标分页) SELECT * FROM logs WHERE create_time > '2024-01-01' ORDER BY create_time LIMIT 20[^4] ``` 4. **执行计划分析技巧** - 使用`EXPLAIN ANALYZE`查看实际执行成本 - 重点关注`type`列(访问类型)和`rows`列(估算行数) - 警惕`Using temporary`和`Using filesort`警告[^5] 5. **事务处理优化** ```sql START TRANSACTION; -- 批量插入操作 INSERT INTO audit_log VALUES (...),(...),(...); COMMIT;[^4] ``` *建议将批量操作控制在500-1000行/批次* ### 三、高级技巧应用 1. **CTE优化复杂查询** ```sql WITH regional_sales AS ( SELECT region, SUM(amount) as total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > 1000000 ) SELECT r.region, p.product, SUM(p.quantity) as product_units FROM orders o JOIN products p ON o.product_id = p.id WHERE r.region IN (SELECT region FROM top_regions) GROUP BY r.region, p.product ``` 2. **窗口函数深度优化** ```sql SELECT user_id, SUM(revenue) OVER ( PARTITION BY user_id ORDER BY event_time ROWS BETWEEN 3 PRECEDING AND CURRENT ROW ) as rolling_7d_revenue FROM user_events[^1] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值