집 >데이터 베이스 >MySQL 튜토리얼 >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 중국어 웹사이트의 기타 관련 기사를 참조하세요!