누군가가 무엇을 설명해 주시겠습니까? partition by
키워드의 기능을 키워드의 실제 예와 사용 이유를 설명해 주시겠습니까? 다른 사람이 작성한 SQL 쿼리가 있으며 그 기능을 파악하려고합니다.
다음에 의한 파티션 예 :
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
온라인에서 본 예제는 너무 심도있게 보입니다.
누군가가 무엇을 설명해 주시겠습니까? partition by
키워드의 기능을 키워드의 실제 예와 사용 이유를 설명해 주시겠습니까? 다른 사람이 작성한 SQL 쿼리가 있으며 그 기능을 파악하려고합니다.
다음에 의한 파티션 예 :
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
온라인에서 본 예제는 너무 심도있게 보입니다.
답변:
이 PARTITION BY
절은 절의 각 "GROUP"에 사용될 레코드 범위를 설정합니다 OVER
.
예제 SQL에서 DEPT_COUNT
모든 직원 레코드에 대해 해당 부서 내의 직원 수를 리턴합니다. ( 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 기사 를 참조하십시오.
last over
and 보다 느리거나 빠르면 혼란 스럽습니다 min over
. 하위 선택이 더 느릴 것이라고 생각하지만 대답의 영어 문법은 그렇지 않습니다.
이 개념은 받아 들여진 대답으로 잘 설명되어 있지만, 더 많은 예제를 볼수록 더 잘 싱크되는 것을 알 수 있습니다. 다음은 증분 예제입니다.
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;
Whic 의미 :
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 |
+--------------+---------------+----------+
기타...
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의 경우 deptno 20 및 30에 대해서도 비슷한 결과를 표 emp에 4 개의 레코드가 있습니다.
이 예는 파티셔닝 작동 방식과 그룹화 작동 방식에 대한 작은 뉘앙스를 제안합니다. 내 예제는 컴파일 버그 인 경우 Oracle 12에서 가져온 것입니다.
나는 시도했다 :
SELECT t.data_key
, SUM ( CASE when t.state = 'A' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_a_rows
, SUM ( CASE when t.state = 'B' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_b_rows
, SUM ( CASE when t.state = 'C' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_c_rows
, COUNT (1) total_rows
from mytable t
group by t.data_key ---- This does not compile as the compiler feels that t.state isn't in the group by and doesn't recognize the aggregation I'm looking for
그러나 이것은 예상대로 작동합니다.
SELECT distinct t.data_key
, SUM ( CASE when t.state = 'A' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_a_rows
, SUM ( CASE when t.state = 'B' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_b_rows
, SUM ( CASE when t.state = 'C' THEN 1 ELSE 0 END)
OVER (PARTITION BY t.data_key) count_c_rows
, COUNT (1) total_rows
from mytable t;
외부 키 "data_key"를 기반으로 각 상태의 요소 수를 생성합니다. 따라서 data_key = 'APPLE'에 상태 'A'의 3 행, 상태 'B'의 2 행, 상태 'C'의 행이있는 경우 'APPLE'에 해당하는 행은 'APPLE', 3, 2가됩니다. , 1, 6.