我们公司上了一套系统,我查看了一下原开发人员在做报表时写的SQL代码,如下所示:
select distinct t3.code,t3.name,t3.material_spec,t3.default_unit,
sum(t2.quantity) over (partition by t3.code) sum_qty,
sum(t2.amount) over (partition by t3.code) sum_amount,
sum(t2.tax_amount) over (partition by t3.code) - sum(t2.amount) over (partition by t3.code) tax,
sum(t2.tax_amount) over (partition by t3.code) total_amount
from t1,t2,t3,t4
where ...
order by t3.code
然后以下是我自己整理的代码:
select t3.code,t3.name,t3.material_spec,t3.default_unit,
sum(t2.quantity) sum_qty,
sum(t2.amount) sum_amount,
sum(t2.tax_amount) - sum(t2.amount) tax,
sum(t2.tax_amount) total_amount
from t1,t2,t3,t4
where ...
group by t3.code,t3.name,t3.material_spec,t3.default_unit
order by t3.code
二者运行的结果一要,性能我的那个要比原开发人员写的来的快。而且相差的性能很明显。用group by要快很多。我就想问一下这里的高人?用partition by是不是有别的用意?会比group by 来的更科学更好?(ps:自己查资料一直找不到答案,所以上这里来麻烦大家了)
问题点数:100、回复次数:5Top
1 楼LoveLwn(小P)回复于 2005-03-08 16:28:34 得分 0
帮顶一下Top
2 楼slyfox123456()回复于 2005-03-08 16:33:26 得分 0
order by
没有分区表快
从算法上都可以看出来Top
3 楼keanu_wang()回复于 2005-03-08 16:39:41 得分 100
partition by关键字是oracle中分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它有一部分函数既是聚合函数也是分析函数,比如avg、max,也有一部分是特有的,比如first、rank,除了order by子句外,分析函数在一个查询中优先级最低。至于partition by和group by谁的性能更好,要看具体情况而定,从你所举的例子而言,partition by的作用仅用于分组,那么性能可能比不上group by。Top
4 楼lynx(lynx)回复于 2005-03-08 17:05:04 得分 0
sum() over (PARTITION BY ...) 是一个分析函数。 他执行的效果跟普通的sum ...group by ...不一样,它计算组中表达式的累积和,而不是简单的和。
表a,内容如下:
B C D
02 02 1
02 03 2
02 04 3
02 05 4
02 01 5
02 06 6
02 07 7
02 03 5
02 02 12
02 01 2
02 01 23
select b,c,sum(d) e from a group by b,c
得到:
B C E
02 01 30
02 02 13
02 03 7
02 04 3
02 05 4
02 06 6
02 07 7
而使用分析函数得到的结果是:
SELECT b, c, d, SUM(d) OVER(PARTITION BY b,c ORDER BY d) e FROM a
B C E
02 01 2
02 01 7
02 01 30
02 02 1
02 02 13
02 03 2
02 03 7
02 04 3
02 05 4
02 06 6
02 07 7
结果不一样,这样看还不是很清楚,我们把d的内容也显示出来就更清楚了:
SELECT b, c, d,SUM(d) OVER(PARTITION BY b,c ORDER BY d) e FROM a
B C D E
02 01 2 2 d=2,sum(d)=2
02 01 5 7 d=5,sum(d)=7
02 01 23 30 d=23,sum(d)=30
02 02 1 1 c值不同,重新累计
02 02 12 13
02 03 2 2
02 03 5 7
02 04 3 3
02 05 4 4
02 06 6 6
02 07 7 7
分享到:
相关推荐
在SQL查询中,`GROUP BY` 和 `PARTITION BY` 都是用来处理数据分组的,但它们在功能和使用场景上有所不同。首先,`GROUP BY` 是一个基础的分组函数,它根据指定的列将数据进行分组,并且通常与聚合函数如 `SUM`, `...
这与`GROUP BY` 有所不同,`GROUP BY` 主要是用于对数据进行聚合,通常与聚合函数(如 `SUM`, `COUNT`, `AVG` 等)结合使用,而返回的结果集中每组只有一条记录。而 `PARTITION BY` 可以在每个分组内部返回多条记录...
这里的`OVER(PARTITION BY column1)`部分相当于`GROUP BY column1`,而`ORDER BY some_column`则确定了在每个组内如何选择记录。 在大数据量处理时,优化`GROUP BY`语句的写法至关重要,因为它直接影响到查询的效率...
介绍了 1.NOT EXISTS, 2.GROUP BY ... [HAVING ...] 3.count(*) over(partition by ...) 做查询的效率,以及各自的使用方法
在MySQL中,`GROUP BY` 语句用于对数据进行分组,通常与聚合函数(如 COUNT(), SUM(), AVG() 等)一起使用,以便对每个分组进行计算。然而,有时候我们可能需要在每个分组中选取特定的一条记录,例如分组内最早或最...
CASE WHEN DATE_SUB(imp_date, INTERVAL 1 DAY) = LAG(imp_date, 1) OVER (PARTITION BY uid ORDER BY imp_date) THEN LAG(consecutive_group, 1) OVER (PARTITION BY uid ORDER BY imp_date) ELSE NULL END AS ...
这通常涉及到`GROUP BY`和`ORDER BY`子句的使用。本篇文章将深入探讨这两种SQL语句,并提供多种实现方式。 首先,`GROUP BY`子句用于将数据按照一个或多个列进行分组,它常与聚合函数(如`COUNT`, `SUM`, `AVG`, `...
在使用窗口函数时,我们可以指定一个窗口(PARTITION BY),排序方式(ORDER BY),甚至窗口大小(frame_clause),这使得窗口函数具有高度的灵活性。 1. **窗口函数的基本结构** 使用窗口函数的语法通常如下: `...
开窗函数是SQL中一种强大的工具,它扩展了SQL的功能,使得在不使用GROUP BY的情况下也能执行聚合操作。开窗函数允许我们在一个查询中同时处理分组和非分组的数据,提高了查询的灵活性和效率。 在传统的SQL查询中,...
使用group by关键字也可以取得不重复的值,例如:Select name from Lin_test group by name功能同distinct,但group by的条件必须是查找出来的所有的元素。使用distinct后,Oracle就会在查找的时候对后面的字段进行...
第五篇 分析函数简述 分析函数的语法结构比较复杂,但多数函数都具有相同的语法...Partition没啥说的,功能强大参数少,主要用于分组,可以理解成select中的group by。不过它跟select语句后跟的group by 子句并不冲突。
- `ROW_NUMBER() OVER (PARTITION BY CONTRACTID ORDER BY ALTER_DATE) AS rn`:此行代码使用`ROW_NUMBER()`函数为每个`CONTRACTID`分组内的记录分配一个行号,按照`ALTER_DATE`升序排列。 2. **最终查询**: - ...
通过合理运用SQL语句,特别是`GROUP BY`、`ORDER BY`以及分析函数等,可以有效地对数据进行分组、排序、聚合等操作。 #### 二、Oracle分组求Top N的方法 **1. 使用`RANK()`函数** - **基本语法**: `RANK()`函数...
- **示例**:假设有一个销售数据表,包含产品类别(`Category`)、品牌(`Brand`)、型号(`Model`)三个字段,我们可以使用`GROUP BY ROLLUP(Category, Brand, Model)`来获取各个层次的汇总数据,从最详细的单个型号销售...
SQL语句:select * from (select name, year b1, lead(year) over (partition by name order by year) b2, lead(m,2) over(partition by name order by year) b3,rank()over( partition by name order by year) rk ...
1. 传统的统计函数,如`COUNT()`,通常与`GROUP BY`一起使用来计算每个类别的数量。例如,我们可以计算每个班级的学生数量: ```sql SELECT t.class, COUNT(*) FROM t_student_score t GROUP BY t.class; ``` 如果...
这里,`COUNT(*) OVER (PARTITION BY corp ORDER BY year)`会根据年份递增的方式累计每个公司每年的电影数量。 ##### 4.3 RANK, DENSE_RANK, ROW_NUMBER 这三个函数用于对结果集中的行进行排序并赋予一个唯一的...
Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它允许用户在单个查询中对数据进行聚合和分组分析,而无需使用子查询或复杂的存储过程。这些函数为数据分析提供了强大的工具,使得处理大量数据变得更加...