programing

ORDER BY 절을 사용하거나 사용하지 않는 파티션에 대한 분석 카운트

magicmemo 2023. 9. 13. 22:31
반응형

ORDER BY 절을 사용하거나 사용하지 않는 파티션에 대한 분석 카운트

사용할 때 왜 다른 결과가 나오는지 이해할 수 없습니다.ORDER BY해석상의 절COUNT기능.

간단한 예를 사용하면 다음과 같습니다.

with req as
 (select 1 as n, 'A' as cls
    from dual
  union
  select 2 as n, 'A' as cls
    from dual)
select req.*, count(*) over(partition by cls) as cnt from req;

는 다음과 같은 결과를 제공합니다.

N   CLS CNT
2   A   2
1   A   2

반면에, 추가할 때는ORDER BY분석 조항에서는 결과가 다릅니다!

with req as
 (select 1 as n, 'A' as cls
    from dual
  union
  select 2 as n, 'A' as cls
    from dual)
select req.*, count(*) over(partition by cls order by n) as cnt from req;

CNT 열이 변경됨:

N   CLS CNT
1   A   1
2   A   2

누가 설명 좀 해주시겠습니까?

감사해요.

첫번째로 문서 링크입니다.하지만 다소 모호합니다.

분석 절은 다음과 같이 구성됩니다.query_partition_clause,order_by_clause그리고.windowing_clause. 그리고, 정말 중요한 것은windowing_clause

지정하지 않으면 이 조항을 지정할 수 없습니다.order_by_clause. 에 의해 정의된 일부 창 경계RANGE절에서 오직 하나의 식만을 지정할 수 있습니다.order_by_clause. "ORDER BY 절에 대한 제한 사항"을 참조하십시오.

사용할 수 없을 뿐만 아니라windowing_clause의 기능하지 않고order_by_clause, 그들은 서로 묶여있습니다.

windowing_clause를 완전히 생략하면 기본값은RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

기본 windowing 절은 running total과 같은 것을 생성합니다.COUNT돌아온다1첫번째 행의 경우, 창 상단과 현재 행 사이에 하나의 행만 존재하므로,2두번째 줄 등등.

따라서 첫 번째 쿼리에는 윈도우 설정이 전혀 없지만 두 번째 쿼리에는 기본 윈도우 설정이 있습니다.

그리고 완전한 경계가 없는 창을 지정하여 첫 번째 쿼리의 동작을 시뮬레이션할 수 있습니다.

with req as
 (select 1 as n, 'A' as cls
    from dual
  union
  select 2 as n, 'A' as cls
    from dual)
select req.*, count(*) over(partition by cls order by n RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as cnt from req;

네.

N   CLS CNT
1   A   2
2   A   2

이것에 대해 가장 쉽게 생각할 수 있는 방법은 - 떠나는 것입니다.ORDER BYout은 파티션의 모든 행이 서로 "병렬"되는 방식으로 "병렬"과 같습니다.실제로 명시적으로 다음을 추가하면 동일한 효과를 얻을 수 있습니다.ORDER BY다음과 같은 조항:ORDER BY 0(또는 임의의 일정한 식에 따라 "순서"), 또는 더 강조하면,ORDER BY NULL.

왜 당신이 그것을.COUNT()아니면SUM()전체 파티션에 대한 등은 기본 윈도우 설정 조항과 관련이 있습니다.RANGE between unbounded preceding and current row. "범위"("ROWs"와 반대)는 현재 행과 "연결"된 모든 행이 포함됨을 의미하며, 이 행 앞에 있지 않더라도 해당 행이 포함됩니다.모든 행이 묶이기 때문에 어떤 행이 "현재"인지에 관계없이 전체 파티션이 포함됨을 의미합니다.

윈도우 함수는 생략할 때 파티션 위에서 (분할 단위로) 집계를 수행합니다.ORDER BY조항 결과는 다음과 유사할 것입니다.GROUP BY각 행의 출력으로생략할 수도 있습니다.PARTITION BY 모든 이며, 에는 을 하는 입니다 이 입니다 이 하는 에는 을 .

ORDER BY window 내에서 하고 window function은션서음로값을다고로션시룹른aof)ehorwnnnn로다(룹wt)m(lne시션nup면

에서 되지 에서 값ORDER BY(peer)n에서 피어라고 합니다.COUNT()총를는막의산와한를질다는질t를esyntelelserfeldtt를은l산는의

언급URL : https://stackoverflow.com/questions/41364665/analytic-count-over-partition-with-and-without-order-by-clause

반응형