有人可以解释一下是什么吗 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 BYSUMAVG等)的结果,而不聚集的结果集(即去除匹配的记录)。

当您使用LAST OVERMIN 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进行的操作的数目

scroll top