Oracle“分区依据”关键字
有人可以解释一下partition by
关键字partition by
什么,并给出一个简单的例子,以及为什么要使用它? 我有一个由其他人写的SQL查询,我试图找出它的作用。
分区的一个例子是:
SELECT empno, deptno, COUNT(*) OVER (PARTITION BY deptno) DEPT_COUNT FROM emp
我在网上看到的例子似乎有点太深入。
PARTITION BY
子句设置将在OVER
子句中用于每个“GROUP”的logging的范围。
在您的示例SQL中, DEPT_COUNT
将为每个员工logging返回该部门中的员工数量。 (就好像你的emp
表非常规化;你仍然返回emp
表中的每一条logging。)
emp_no dept_no DEPT_COUNT 1 10 3 2 10 3 3 10 3 <- three because there are three "dept_no = 10" records 4 20 2 5 20 2 <- two because there are two "dept_no = 20" records
如果有另一个栏目(例如state
),那么你可以指望该州有多less个部门。
这就像得到一个GROUP BY
( SUM
, AVG
等)的结果而没有结果集合的集合。
例如,使用LAST OVER
或MIN OVER
函数来获取部门中最低和最高工资,然后在没有子select的情况下用这个logging工资进行计算时,这非常有用。
阅读链接的AskTom文章了解更多详情。
这个概念被接受的答案很好地解释了,但是我发现越多的例子,它就越好。下面是一个递增的例子:
1) Boss说: “让我按品牌分组的商品数量”
你说 :“没问题”
SELECT BRAND ,COUNT(ITEM_ID) FROM ITEMS GROUP BY BRAND;
结果:
+--------------+---------------+ | Brand | Count | +--------------+---------------+ | H&M | 50 | +--------------+---------------+ | Hugo Boss | 100 | +--------------+---------------+ | No brand | 22 | +--------------+---------------+
2) 老板说: “现在给我一个所有项目的清单,其品牌和具有该品牌的项目数量”
你可以尝试:
SELECT ITEM_NR ,BRAND ,COUNT(ITEM_ID) FROM ITEMS GROUP BY BRAND;
但是你得到:
ORA-00979: not a GROUP BY expression
这是OVER (PARTITION BY BRAND)
来源:
SELECT ITEM_NR ,BRAND ,COUNT(ITEM_ID) OVER (PARTITION BY BRAND) FROM ITEMS;
这意味着:
-
COUNT(ITEM_ID)
– 获取项目数量 -
OVER
– 在一组行上 -
(PARTITION BY BRAND)
– 具有相同的品牌
结果是:
+--------------+---------------+----------+ | Items | Brand | Count() | +--------------+---------------+----------+ | Item 1 | Hugo Boss | 100 | +--------------+---------------+----------+ | Item 2 | Hugo Boss | 100 | +--------------+---------------+----------+ | Item 3 | No brand | 22 | +--------------+---------------+----------+ | Item 4 | No brand | 22 | +--------------+---------------+----------+ | Item 5 | H&M | 50 | +--------------+---------------+----------+
等等…
这是称为分析的SQL扩展。 select语句中的“over”告诉oracle,函数是一个parsing函数,而不是一组函数。 使用分析的优势在于,只需传递一次数据就可以收集总和,计数和更多内容,而无需循环使用子select或更差的PL / SQL数据。
它起初看起来很混乱,但这很快就会成为第二本性。 汤姆·凯特(Tom Kyte)没有人会说得更好。 所以上面的链接是伟大的。
当然,阅读文档是必须的。
EMPNO DEPTNO DEPT_COUNT
7839 10 4 5555 10 4 7934 10 4 7782 10 4 --- 4 records in table for dept 10 7902 20 4 7566 20 4 7876 20 4 7369 20 4 --- 4 records in table for dept 20 7900 30 6 7844 30 6 7654 30 6 7521 30 6 7499 30 6 7698 30 6 --- 6 records in table for dept 30
在这里,我们正在计数各自的deptno。 至于deptno 10,我们在表格emp中有4个logging,deptno 20和30也有类似的结果。
over分区关键字就好像我们通过client_id创build每个客户端id的子集来对数据进行分区
select client_id, operation_date, row_number() count(*) over (partition by client_id order by client_id ) as operationctrbyclient from client_operations e order by e.client_id;
这个查询将返回由client_id完成的操作次数