복붙노트

[SQL] 오라클 키워드 "으로 파티션"

SQL

오라클 키워드 "으로 파티션"

하나를 사용하려는 이유 누군가가 키워드로 파티션이 무엇을 설명하고뿐만 아니라 같은 행동에 그것의 간단한 예제를 적어주세요 수 있습니까? 나는 다른 사람에 의해 작성된 SQL 쿼리를 가지고 있고 나는 그것이 무엇을 알아 내려고 노력하고있어.

하여 파티션의 예 :

SELECT empno, deptno, COUNT(*) 
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp

나는 온라인 봤어요 예제는 심도도 조금 보인다.

해결법

  1. ==============================

    1.PARTITION BY 절은 OVER 절 내의 각 "그룹"에 사용되는 기록의 범위를 설정합니다.

    PARTITION BY 절은 OVER 절 내의 각 "그룹"에 사용되는 기록의 범위를 설정합니다.

    귀하의 예를 들어 SQL에서 DEPT_COUNT는 모든 직원 레코드를 해당 부서 내 직원의 수를 반환합니다. (당신은 emp 테이블을 드 nomalising있는 것과 같다, 당신은 여전히 ​​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
    

    다른 열이 있다면 (예를 들어, 상태) 당신은 얼마나 많은 부서에서 그 국가를 셀 수 있습니다.

    그것은 (즉 일치하는 레코드를 제거하는) 결과 집합을 응집없이 (SUM, AVG 등) 그룹의 결과를 얻는 것과 같다.

    당신은, 예를 들면, 최저 및 최고 부서에서 급여 다음은 하위없이이 기록 급여에 대한 계산에 훨씬 더 빨리, 이는 선택하는 것이 사용 얻을 수있는 마지막 OVER 또는 MIN OVER 기능을 사용할 때 유용합니다.

    자세한 내용은 링크 된 AskTom 문서를 참조하십시오.

  2. ==============================

    2.개념은 아주 잘 허용 대답으로 설명하지만, 내가 더 예를 들어 하나가 보는 것을 발견, 더 나은이의 싱크 다음 증분 예입니다. :

    개념은 아주 잘 허용 대답으로 설명하지만, 내가 더 예를 들어 하나가 보는 것을 발견, 더 나은이의 싱크 다음 증분 예입니다. :

    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 (BRAND BY PARTITION)이 들어오는 곳이다 :

     SELECT 
          ITEM_NR
          ,BRAND
          ,COUNT(ITEM_ID) OVER (PARTITION BY BRAND) 
     FROM 
          ITEMS;
    

    어떤 수단 :

    그리고 그 결과는 다음과 같습니다

    +--------------+---------------+----------+
    |  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     | 
    +--------------+---------------+----------+
    

    기타...

  3. ==============================

    3.이 분석라는 SQL 확장이다. 은 "이상은"select 문에서 함수가 분석 기능, 기능에 의해 그룹에없는 것을 오라클을 알려줍니다. 분석을 사용하는 장점은 대신 하위 선택하거나 악화, PL / SQL과 데이터를 통해 반복의 데이터를 하나의 패스로 더 많은 금액, 횟수를 수집 할 수 있다는 것입니다.

    이 분석라는 SQL 확장이다. 은 "이상은"select 문에서 함수가 분석 기능, 기능에 의해 그룹에없는 것을 오라클을 알려줍니다. 분석을 사용하는 장점은 대신 하위 선택하거나 악화, PL / SQL과 데이터를 통해 반복의 데이터를 하나의 패스로 더 많은 금액, 횟수를 수집 할 수 있다는 것입니다.

    처음에는 혼란 보입니까하지만이 빨리 제 2의 천성이 될 것입니다. 아무도 더 나은 다음 톰 카이트을 설명합니다. 그래서 위의 링크는 중대하다.

    물론, 문서를 읽는 것은 필수입니다.

  4. ==============================

    4.

    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 개 기록을 가지고있다.

  5. ==============================

    5.우리가 CLIENT_ID하여 데이터를 분할하는 것처럼 이상의 파티션 키워드는 각 클라이언트 ID의 생성 A는 집합

    우리가 CLIENT_ID하여 데이터를 분할하는 것처럼 이상의 파티션 키워드는 각 클라이언트 ID의 생성 A는 집합

    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에 의해 수행 작업의 수를 반환합니다

  6. ==============================

    6.나는이 예제 작품으로 작은 파티션이 어떻게 작동하는지에 대한 뉘앙스 방법 그룹을 제안, 생각합니다. 내 예제는 컴파일의 버그가 발생하는 경우 내 예는, 오라클 (12)이다.

    나는이 예제 작품으로 작은 파티션이 어떻게 작동하는지에 대한 뉘앙스 방법 그룹을 제안, 생각합니다. 내 예제는 컴파일의 버그가 발생하는 경우 내 예는, 오라클 (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.

  7. from https://stackoverflow.com/questions/561836/oracle-partition-by-keyword by cc-by-sa and MIT license