>데이터 베이스 >MySQL 튜토리얼 >SQL에서 연속 날짜 범위를 효율적으로 감지하고 추출하는 방법은 무엇입니까?

SQL에서 연속 날짜 범위를 효율적으로 감지하고 추출하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-05 01:58:41954검색

How to Efficiently Detect and Extract Consecutive Date Ranges in SQL?

SQL에서 연속 날짜 범위 검색

소개

다양한 애플리케이션에서 그룹화하고 추출해야 하는 경우가 자주 발생합니다. 지정된 입력의 연속 날짜 범위입니다. 이 작업은 달력 채우기 또는 데이터 분석과 같은 상황에서 발생합니다. SQL의 강력한 기능을 활용하면 복잡한 조인이나 재귀적 CTE 없이 문제를 효율적으로 해결할 수 있습니다.

문제 정의

'InfoDate'라는 열을 고려해보세요. 아래 그림과 같이 일련의 날짜를 포함합니다.

InfoDate
2013-12-04
2013-12-05
2013-12-06
2013-12-09
2013-12-10
2014-01-01
2014-01-02
2014-01-03
2014-01-06
2014-01-07
2014-01-29
2014-01-30
2014-01-31
2014-02-03
2014-02-04

목표는 각 연속된 날짜를 식별하는 것입니다. 날짜 범위를 선택하고 각 간격의 시작 날짜와 종료 날짜를 추출합니다. 아래 예에서 볼 수 있듯이 연속된 날짜를 그룹화하여 범위를 형성해야 합니다.

StartDate EndDate
2013-12-04 2013-12-06
2013-12-09 2013-12-10
2014-01-01 2014-01-03
2014-01-06 2014-01-07
2014-01-29 2014-01-31
2014-02-03 2014-02-04

SQL 솔루션

SQL을 사용하여 이 결과를 얻으려면 다음을 활용합니다. 행 번호 매기기와 날짜 구분을 조합하여 사용하는 기술입니다. ROW_NUMBER() 함수를 사용하여 'InfoDate' 컬럼의 각 행에 일련번호('i')를 할당하고 'd'라는 컬럼을 생성합니다. 이 열은 각 날짜와 해당 행 번호 간의 차이를 나타냅니다.

WITH t AS (
  SELECT InfoDate d,ROW_NUMBER() OVER(ORDER BY InfoDate) i
  FROM @d
  GROUP BY InfoDate
)

다음 단계에서는 'i' 열과 'd' 열 간의 차이를 기준으로 행을 그룹화합니다(DATEDIFF(day,i, 디)). 이 그룹화를 사용하면 동일한 차이 값을 공유하므로 연속된 날짜를 식별할 수 있습니다.

SELECT MIN(d),MAX(d)
FROM t
GROUP BY DATEDIFF(day,i,d)

각 그룹 내에서 MIN() 및 MAX() 함수를 사용하여 시작 날짜와 종료 날짜를 결정할 수 있습니다. 각 연속 범위.

| StartDate | EndDate |
|---|---|
| 2013-12-04 | 2013-12-06 |
| 2013-12-09 | 2013-12-10 |
| 2014-01-01 | 2014-01-03 |
| 2014-01-06 | 2014-01-07 |
| 2014-01-29 | 2014-01-31 |
| 2014-02-03 | 2014-02-04 |

이런 방식으로 순수 SQL 기반 접근 방식을 사용하여 연속 날짜 범위를 효율적으로 추출했습니다.

위 내용은 SQL에서 연속 날짜 범위를 효율적으로 감지하고 추출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.