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 BYSUMAVG等)的结果而没有结果集合的集合。

例如,使用LAST OVERMIN 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完成的操作次数