![]() |
|
Archives of the TeradataForumMessage Posted: Tue, 14 Nov 2006 @ 19:50:50 GMT
Rajesh, Try the following. The first step is intended to simulate your source table, the second determines the different start and stopping points and the third consolidates it into the different ranges. --This is your data
create volatile table MyData as
(sel
day_of_calendar as MyValue
,ROW_NUMBER() OVER (ORDER BY day_of_calendar) as Row_Num
from
sys_calendar.calendar
where
day_of_calendar < 10
or day_of_calendar between 24 and 31
or day_of_calendar between 45 and 62
or day_of_calendar = 88
group by 1) with data on commit preserve rows;
--Build a table that contains all the start and stopping points
create volatile table MyRanges as
(SELECT
MiddleT.*
,CASE WHEN PriorT.Myvalue IS NOT NULL THEN 'Y'
ELSE 'N'
END As PriorExists
,CASE WHEN AfterT.Myvalue IS NOT NULL THEN 'Y'
ELSE 'N'
END As AfterExists
,ROW_NUMBER() OVER (ORDER BY MiddleT.MyValue) as Range_Nbr
FROM
MyData MiddleT
LEFT JOIN
MyData AfterT
ON
AfterT.Myvalue = MiddleT.myValue + 1
LEFT JOIN
MyData PriorT
ON
PriorT.Myvalue = MiddleT.myValue - 1
WHERE
AfterT.MyValue IS NULL
OR
PriorT.MyValue IS NULL
) with data on commit preserve rows;
--Consolidate the different start and stopping points into ranges
SELECT
ROW_NUMBER() OVER (ORDER BY MIN_Val) as Set_Nbr
,L.MyValue AS MIN_Val
,CASE
WHEN r.priorExists = 'Y' then r.MyValue
ELSE L.MyValue
END AS Max_Val
FROM
MyRANGES L
LEFT JOIN
MyRANGES R
on
l.Range_Nbr + 1 = r.Range_Nbr
AND l.afterExists = 'Y'
WHERE
l.priorExists = 'N';
Johannes de Wet
| ||||||||||||||||||||||||||||||||||||||||||||||||
| | ||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||
| Copyright 2016 - All Rights Reserved | ||||||||||||||||||||||||||||||||||||||||||||||||
| Last Modified: 15 Jun 2023 | ||||||||||||||||||||||||||||||||||||||||||||||||