2014-02-19 49 views
-2

查詢:意義甲骨文

SELECT department_id "Dept", hire_date "Date", last_name "Name", 
    LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date, last_name) 
    OVER (PARTITION BY department_id) as "Emp_list" 
FROM employees 
WHERE hire_date < '01-SEP-2003' 
ORDER BY "Dept", "Date", "Name"; 
 
    Dept Date  Name   Emp_list 
    ----- --------- --------------- -------------------------------- 
     30 07-DEC-02 Raphaely  Raphaely; Khoo 
     30 18-MAY-03 Khoo   Raphaely; Khoo 
     40 07-JUN-02 Mavris   Mavris 
     50 01-MAY-03 Kaufling  Kaufling; Ladwig 
     50 14-JUL-03 Ladwig   Kaufling; Ladwig 
     70 07-JUN-02 Baer   Baer 
     90 13-JAN-01 De Haan   De Haan; King 
     90 17-JUN-03 King   De Haan; King 
     100 16-AUG-02 Faviet   Faviet; Greenberg 
     100 17-AUG-02 Greenberg  Faviet; Greenberg 
     110 07-JUN-02 Gietz   Gietz; Higgins 
     110 07-JUN-02 Higgins   Gietz; Higgins 

的疑問: 什麼是在這裏分區的意義?

回答

0

下面是一個簡短的答案。不過,您應該閱讀關於分析函數的documentation

函數list_agg() - 與許多Oracle函數一樣 - 可以是聚合函數或分析函數。我假設你知道什麼是聚合函數。 group by子句將所有具有相同聚合變量值的行放在一行中。

分析函數是相似的,但當然不同。他們還可以找到彼此相似的行組。但是,他們沒有將它們總結在一行上。他們只需添加一個包含該信息的新列。子句partition by指定如何創建組。

因此,此查詢將行中的所有last_name與相同的department_id組合在一起。 last_names按照招聘日期和名稱進行排序。該列表隨後附加到同一個表中的每一行。您可以將您的查詢與類似的彙總查詢進行比較:

SELECT department_id "Dept", 
     LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date, last_name) 
FROM employees 
WHERE hire_date < '01-SEP-2003' 
GROUP BY department_id;