반응형
ORACLE SQL 날짜 범위 교차점
테이블 T1이 있습니다. 테이블에는 NAME 값(고유하지 않음)과 날짜 범위(D1 및 D2는 날짜)가 포함되어 있습니다.NAME이 동일한 경우 날짜 범위(예: B)를 결합합니다.
하지만 결과적으로 (X) 모든 날짜 범위의 교차점을 만들어야 합니다.
편집: 표 T1
NAME | D1 | D2
A | 20100101 | 20101211
B | 20100120 | 20100415
B | 20100510 | 20101230
C | 20100313 | 20100610
결과:
X | 20100313 | 20100415
X | 20100510 | 20100610
시각적으로 보면 다음과 같은 결과를 얻을 수 있습니다.
NAME : date range
A : [-----------------------]-----
B : --[----]----------------------
B : ----------[---------------]---
C : -----[--------]---------------
결과:
X : -----[-]----------------------
X : ----------[---]---------------
SQL / PL SQL을 사용하여 그것을 얻는 방법이 있습니까?
다음은 빠른 솔루션입니다(가장 효율적이지 않을 수 있음).
SQL> CREATE TABLE myData AS
2 SELECT 'A' name, date'2010-01-01' d1, date'2010-12-11' d2 FROM DUAL
3 UNION ALL SELECT 'B', date'2010-01-20', date'2010-04-15' FROM DUAL
4 UNION ALL SELECT 'B', date'2010-05-10', date'2010-12-30' FROM DUAL
5 UNION ALL SELECT 'C', date'2010-03-13', date'2010-06-10' FROM DUAL;
Table created
SQL> WITH segments AS (
2 SELECT dat seg_low, lead(dat) over(ORDER BY dat) seg_high
3 FROM (SELECT d1 dat FROM myData
4 UNION
5 SELECT d2 dat FROM myData)
6 )
7 SELECT s.seg_low, s.seg_high
8 FROM segments s
9 JOIN myData m ON s.seg_high > m.d1
10 AND s.seg_low < m.d2
11 GROUP BY s.seg_low, s.seg_high
12 HAVING COUNT(DISTINCT NAME) = 3;
SEG_LOW SEG_HIGH
----------- -----------
13/03/2010 15/04/2010
10/05/2010 10/06/2010
저는 가능한 모든 연속적인 날짜 범위를 구축하고 샘플 데이터와 함께 이 "일정관리"에 참여합니다.값이 3개인 모든 범위가 나열됩니다.행을 추가하는 경우 결과를 병합해야 할 수 있습니다.
SQL> insert into mydata values ('B',date'2010-04-15',date'2010-04-16');
1 row inserted
SQL> WITH segments AS (
2 SELECT dat seg_low, lead(dat) over(ORDER BY dat) seg_high
3 FROM (SELECT d1 dat FROM myData
4 UNION
5 SELECT d2 dat FROM myData)
6 )
7 SELECT MIN(seg_low), MAX(seg_high)
8 FROM (SELECT seg_low, seg_high, SUM(gap) over(ORDER BY seg_low) grp
9 FROM (SELECT s.seg_low, s.seg_high,
10 CASE
11 WHEN s.seg_low
12 = lag(s.seg_high) over(ORDER BY s.seg_low)
13 THEN 0
14 ELSE 1
15 END gap
16 FROM segments s
17 JOIN myData m ON s.seg_high > m.d1
18 AND s.seg_low < m.d2
19 GROUP BY s.seg_low, s.seg_high
20 HAVING COUNT(DISTINCT NAME) = 3))
21 GROUP BY grp;
MIN(SEG_LOW) MAX(SEG_HIGH)
------------ -------------
13/03/2010 16/04/2010
10/05/2010 10/06/2010
언급URL : https://stackoverflow.com/questions/3476733/oracle-sql-date-range-intersections
반응형
'source' 카테고리의 다른 글
offsetTop 대 jQuery.offset().top (0) | 2023.08.30 |
---|---|
토요일과 일요일(및 공휴일)을 비활성화하기 위해 jQuery UI Datepicker를 만들 수 있습니까? (0) | 2023.08.30 |
MySQL 대량 INSERT 또는 UPDATE (0) | 2023.08.30 |
Express 미들웨어의 req.local 대 res.local 대 res.data 대 req.data 대 app.local (0) | 2023.08.30 |
두 배열의 값이 동일한지 확인하는 방법 (0) | 2023.08.30 |