I have this data in a table
FIELD_A FIELD_B FIELD_D 249052903 10/15/2011 N 249052903 11/15/2011 P ------------- VALUE CHANGED 249052903 12/15/2011 P 249052903 1/15/2012 N ------------- VALUE CHANGED 249052903 2/15/2012 N 249052903 3/15/2012 N 249052903 4/15/2012 N 249052903 5/15/2012 N 249052903 6/15/2012 N 249052903 7/15/2012 N 249052903 8/15/2012 N 249052903 9/15/2012 N
When ever the value in FIELD_D changes it forms a group and I need the min and max dates in that group. The query shoud return
FIELD_A GROUP_START GROUP_END 249052903 10/15/2011 10/15/2011 249052903 11/15/2011 12/15/2011 249052903 1/15/2012 9/15/2012
The examples that I have seen so far have the data in Field_D being unique. Here the data can repeat as shown, First it is “N” then it changes to “P” and then back to “N”.
Any help will be appreciated
Thanks
Advertisement
Answer
You can use analytic functions – LAG, LEAD, and COUNT() OVER to your advantage, if they are supported by your SQL implementation. SQL Fiddle here.
WITH EndsMarked AS ( SELECT FIELD_A, FIELD_B, CASE WHEN FIELD_D = LAG(FIELD_D,1) OVER (ORDER BY FIELD_B) THEN 0 ELSE 1 END AS IS_START, CASE WHEN FIELD_D = LEAD(FIELD_D,1) OVER (ORDER BY FIELD_B) THEN 0 ELSE 1 END AS IS_END FROM T ), GroupsNumbered AS ( SELECT FIELD_A, FIELD_B, IS_START, IS_END, COUNT(CASE WHEN IS_START = 1 THEN 1 END) OVER (ORDER BY FIELD_B) AS GroupNum FROM EndsMarked WHERE IS_START=1 OR IS_END=1 ) SELECT FIELD_A, MIN(FIELD_B) AS GROUP_START, MAX(FIELD_B) AS GROUP_END FROM GroupsNumbered GROUP BY FIELD_A, GroupNum;