아래 쿼리 1,2번 뜻과 차이점은?
1. datediff(ymdt_1,lag(ymdt_1,1) over (order by ymdt_1) as 경과일수_A
2. datediff(ymdt_1,lag(ymdt_1,1) over (partition by seq by ymdt_1) as 경과일수_B
주신 두 SQL 구문은 DATEDIFF와 LAG 윈도우 함수를 사용해서 날짜 간 차이, 즉 경과일수를 구하는 용도인데요.
둘 다 유사해 보이지만 PARTITION BY의 유무에 따라 중요한 차이가 생깁니다.
DATEDIFF(ymdt_1, LAG(ymdt_1, 1) OVER (ORDER BY ymdt_1)) AS 경과일수_A
DATEDIFF(ymdt_1, LAG(ymdt_1, 1) OVER (PARTITION BY seq ORDER BY ymdt_1)) AS 경과일수_B
| 항목 | 경과일수_A(1번) | 경과일수_B (2번) |
| 비교 기준 | 전체 행 기준 | seq별 그룹 기준 |
| 이전 값(LAG) | 전체 행에서 바로 앞에 있는 ymdt_1 | 같은 seq 값 안에서 앞에 있는 ymdt_1 |
| 용도 예시 | 전체 연속적인 날짜 간격 확인 | 사용자별, 그룹별, 카테고리별 날짜 간격 분석 |
| 첫 행 결과 | 전체 첫 행은 NULL | 각 seq별 첫 행은 NULL |
-- 예시 데이터
seq | ymdt_1
------|------------
A | 2024-01-01
A | 2024-01-05
A | 2024-01-10
B | 2024-01-02
B | 2024-01-06
정렬 기준은 ymdt_1, 그룹 나눔 없음
| seq | ymdt_1 | LAG(ymdt_1) | 경과일수_A |
| A | 2024-01-01 | NULL | NULL |
| B | 2024-01-02 | 2024-01-01 | 1 |
| A | 2024-01-05 | 2024-01-02 | 3 |
| B | 2024-01-06 | 2024-01-05 | 1 |
| A | 2024-01-10 | 2024-01-06 | 4 |
그룹 seq 기준으로 내부 정렬 후 이전값과 비교
| seq | ymdt_1 | LAG(ymdt_1) | 경과일수_B |
| A | 2024-01-01 | NULL | NULL |
| A | 2024-01-05 | 2024-01-01 | 4 |
| A | 2024-01-10 | 2024-01-05 | 5 |
| B | 2024-01-02 | NULL | NULL |
| B | 2024-01-06 | 2024-01-02 | 4 |
DATEDIFF(ymdt_1, LAG(ymdt_1, 1) OVER (PARTITION BY seq) AS 경과일수_B
여기서 ORDER BY 없이 PARTITION BY seq만 사용하는 것이 가능한지 → 가능은 하지만 거의 무의미하며, 실질적인 결과가 보장되지 않습니다.
LAG(ymdt_1) OVER (PARTITION BY seq)
LAG(ymdt_1) OVER (PARTITION BY seq ORDER BY ymdt_1)
이렇게 해야 사용자별로 날짜 순으로 정렬한 후, 바로 이전 날짜와의 차이를 올바르게 구할 수 있습니다.
| 구문 | 실행 가능 여부 | 설명 |
| LAG(...) OVER (PARTITION BY seq) | ✅ 가능하지만 ⚠️ 권장되지 않음 | 이전 행이 어떤 것인지 불명확 |
| LAG(...) OVER (PARTITION BY seq ORDER BY ymdt_1) | ✅ 권장 | 사용자별로 날짜순으로 정확한 이전 날짜를 지정 |
DATEDIFF( ymdt_1, LAG(ymdt_1, 1) OVER (PARTITION BY seq ORDER BY ymdt_1) ) AS 경과일수_B
| sql 쿼리에서 current_timestamp 기능이란? (1) | 2025.07.19 |
|---|---|
| sql 쿼리에서 순위 dense_rank() 함수 사용하는 방법은? (0) | 2025.07.19 |
| 큐브리드 쿼리 플랜에서 비용 수치를 낮추는 방법은? (0) | 2025.06.24 |
| sqlite 에서 rank 함수같은 역할은? 요일별로 상위 3개 조회하기 (0) | 2025.06.24 |
| 데이터베이스 /*+ordered use_nl */ 힌트를 쓰면 무조건 성능이 좋은걸까? (0) | 2025.06.23 |