题
有人可以解释一下是什么吗 partition by
关键字确实如此,并给出了一个简单的实际例子,以及为什么要使用它?我有一个别人写的 SQL 查询,我想弄清楚它的作用。
分区示例:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
我在网上看到的例子似乎有点太深入了。
解决方案
在PARTITION BY
子句设置的将被用于OVER
条款内的每个“GROUP”的记载的范围内。
在你的榜样SQL,DEPT_COUNT
会该部门为每一位员工记录中返回的员工数量。 (这是因为如果你去nomalising的emp
表。你还是回到每一条记录在emp
表)
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
),那么你可以指望有多少部门在该国。
有象得到GROUP BY
(SUM
,AVG
等)的结果,而不聚集的结果集(即去除匹配的记录)。
当您使用LAST OVER
或MIN OVER
函数来获得,例如,在部门的最低和最高工资,然后用在对这种计算是非常有用的记录工资的不的子选择,这是要快得多。
读取链接 AskTom文章的进一步的细节。
其他提示
已接受的答案很好地解释了这个概念,但我发现看到的示例越多,理解得越好。这是一个增量示例:
1) 老板说 “让我了解按品牌分组的库存商品数量”
你说:“没问题”
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 |
+--------------+---------------+----------+
ETC...
它是SQL扩展称为分析。 “过”在SELECT语句告诉Oracle,该函数是一个解析函数,而不是一组的功能。使用分析的好处是,你可以收集总和,计数,和更多的只有一次通过数据,而不是通过与子选择或更糟的是,PL / SQL数据循环的。
它看起来在第一混乱,但这将是第二自然快。没有人解释它更好然后汤姆凯特。所以上面的链接是很大的。
当然,读取文档一>是必须的。
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我们有4条记录在表EMP类似的结果为DEPTNO 20和30也
过分区关键字是,如果我们通过分隔CLIENT_ID数据 创建每个客户端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进行的操作的数目