이 쿼리는 SQL SERVER에서 작동합니다. PARTITION
은 ANSI SQL 명령이므로 INGRES가 지원하는지 여부는 알 수 없습니다. 파티션이 아마 지원되는 경우 주어진 예제의 결과 Dense_Rank()
select *
INTO #TEMP
from (
select 'A' as Ref, Cast('1997-01-04' as DateTime) as From_date, Cast('1998-01-04' as DateTime) as to_date
union
select 'A' as Ref, Cast('1998-01-04' as DateTime) as From_date, Cast('1998-05-27' as DateTime) as to_date
union
select 'A' as Ref, Cast('1998-05-27' as DateTime) as From_date, Cast('1999-01-04' as DateTime) as to_date
union
select 'B' as Ref, Cast('1997-01-04' as DateTime) as From_date, Cast('1998-01-04' as DateTime) as to_date
union
select 'B' as Ref, Cast('1998-01-04' as DateTime) as From_date, Cast('1998-07-26' as DateTime) as to_date
union
select 'B' as Ref, Cast('2012-01-04' as DateTime) as From_date, Cast('2013-01-04' as DateTime) as to_date
) X
SELECT *
FROM
(
SELECT Ref, Min(NewStartDate) From_Date, MAX(To_Date) To_Date, COUNT(1) OVER (PARTITION BY Ref) As [CountRanges]
FROM
(
SELECT Ref, From_Date, To_Date,
NewStartDate = Range_UNTIL_NULL.From_Date + NUMBERS.number,
NewStartDateGroup = DATEADD(d,
1 - DENSE_RANK() OVER (PARTITION BY Ref ORDER BY Range_UNTIL_NULL.From_Date + NUMBERS.number),
Range_UNTIL_NULL.From_Date + NUMBERS.number)
FROM
(
--This subquery is necesary needed to "expand the To_date" to the next day and allowing it to be null
SELECT
REF, From_date, DATEADD(d, 1, ISNULL(To_Date, From_Date)) AS to_date
FROM #Temp T1
WHERE
NOT EXISTS ( SELECT *
FROM #Temp t2
WHERE T1.Ref = T2.Ref and T1.From_Date > T2.From_Date AND T2.To_Date IS NULL
)
) AS Range_UNTIL_NULL
CROSS APPLY Enumerate (ABS(DATEDIFF(d, From_Date, To_Date))) AS NUMBERS
) X
GROUP BY Ref, NewStartDateGroup
) OVERLAPED_RANGES_WITH_COUNT
-- WHERE OVERLAPED_RANGES_WITH_COUNT.CountRanges >= 2 --This filter is for identifying ranges that have at least one gap
ORDER BY Ref, From_Date
에 상응하는 것이다 것은 :
Ref From_Date To_Date CountRanges
---- ----------------------- ----------------------- -----------
A 1997-01-04 00:00:00.000 1999-01-05 00:00:00.000 1
B 1997-01-04 00:00:00.000 1998-07-27 00:00:00.000 2
B 2012-01-04 00:00:00.000 2013-01-05 00:00:00.000 2
는 "CountRanges"> (1)가 적어도 하나가를 갖는 심판을 볼 수 격차
는
이 대답은 지금까지 초기 질문 beyound가는 이유는
- R 단지 간격이있는 심판 요청하지만,이 쿼리는 격차를
- 아시고 쿼리를 나열 할 수 있습니다
- 문제를 발생할 수있는 초기 문제의 경우 Anges의 overlaped 할 수는 명확하지 않다 반 세그먼트를 나타내는, 널 (null)에 TO_DATE 수 있습니다 무한대로
이러한 접근 방식을 사용하면 어느 ref에 간격이 있는지 식별 할 수 있지만 간격을 나열 할 수는 없습니다. – Qsebas
@ Qsebas. . . "Ingres SQL에서 어떤 REF가 날짜 간격에 차이가 있는지 확인하는 방법을 알고 싶습니다." –
예! 확실한! 당신의 접근 방식은 질문에 대답하기에 더 짧고 충분합니다. 하지만 _MAYBE_ 누군가가 필요에 따라 틈새를 나열하는 데 신경을 써야하며 (그렇다면 광산과 같은) 더 복잡한 쿼리가 필요할 경우 ... 대답을 +1 할 것입니다. 더 짧고 명확하게 :) – Qsebas