ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION1495 / 1500

같은 날짜에 여러 거래가 있을 때 ROWS BETWEEN과 ORDER BY tie-breaker가 누적합을 어떻게 바꾸나요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

ROWS는 peer group이 아니라 물리적 행 위치로 frame을 셉니다. 같은 날짜에 금액 10,20,30이 있고 ORDER BY date만 두었다고 하겠습니다. 내부 순서가 10,20,30이면 누적합은 10,30,60이지만 30,10,20이면 30,40,60입니다. 전체 합은 같아도 각 거래의 잔액과 ROWS 1 PRECEDING의 중간 결과가 달라집니다. 날짜만으로는 동점의 업무 순서가 정의되지 않은 상태입니다.

행 단위 누적이 요구되면 ORDER BY occurred_at, transaction_id처럼 결정적인 tie-breaker를 둡니다. 하지만 transaction_id를 추가하면 같은 날짜 행이 서로 다른 peer가 됩니다. 같은 날짜 거래를 한 번에 반영하려는 일별 보고서라면 유일 키를 넣은 ROWS가 아니라 날짜 peer를 유지하는 RANGE 또는 GROUPS가 의미에 맞을 수 있습니다. window ORDER BY는 계산 순서일 뿐 최종 SELECT 출력 순서가 아니므로 바깥 ORDER BY도 둡니다.

늦게 들어온 같은 날짜 거래가 있으면 동일 시점의 snapshot을 고정해야 과거 누적합을 재현할 수 있습니다. 검증 fixture에는 동점 0·1·3건과 두 내부 순서를 넣고 각 frame 구성원을 표로 비교합니다. 위 값은 설명용 손계산이며 특정 DB 실행 결과로 가장하지 않습니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • 10·20·30의 두 내부 순서에서 10,30,60과 30,40,60을 계산합니다.
  • tie-breaker가 결정성을 높이면서 peer 의미를 바꾼다는 점을 설명합니다.
  • 계산 순서·출력 순서·snapshot 재현성을 분리합니다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • 날짜만 ORDER BY해 동점 순서가 항상 고정된다고 합니다.
  • tie-breaker를 넣으면 언제나 같은 날짜 그룹 의미가 보존된다고 말합니다.
  • ROWS의 결과를 RANGE 또는 GROUPS의 peer 결과와 혼동합니다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

  • 늦게 삽입된 거래로 기존 화면이 바뀔 때 snapshot과 재계산 정책을 비교해 보세요.
  • 일별 잔액과 거래별 잔액에서 ROWS와 GROUPS 중 어떤 계약이 맞는지 사례를 만들어 보세요.

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

← 전체 질문 보기