Sql или PLSQL: сжатие набора данных при сохранении непрерывности дат
У меня есть интересный набор данных, который мне нужно сжать, сохраняя непрерывность дат. Я изо всех сил пытался сформулировать логику, чтобы решить этот вопрос. На самом деле, я смог прийти с логикой группировки с помощью курсора, но набор данных содержит более 5 миллионов строк, и выполнение запросов обновления 5 миллионов раз-это не вариант.
ПРОБЛЕМА:
Если почтовый индекс совпадает с почтовым индексом следующей строки, то они должны быть сжаты в одну строку, используя минимальную дату начальной строки и максимальную дату конечной строки.
По сути, я создал последнюю группировку столбцов вручную, чтобы показать, как данные должны быть организованы, чтобы я мог легко сжать их.
Вы можете видеть, что строки 6,7,8 должны быть сгруппированы вместе, так же как и строки 21-23, и так далее, и так далее.
После сжатия набор данных должен возвращать 30 строк, а не 38.
ID ZIP START END Rank Grouping 500 55106 7/8/2009 9/1/2009 1 1 500 55407 9/2/2009 11/23/2009 2 2 500 55411 11/24/2009 11/29/2009 3 3 500 55407 11/30/2009 12/13/2009 4 4 500 55429 12/14/2009 12/20/2009 5 5 500 55407 12/21/2009 12/22/2009 6 6 500 55407 12/23/2009 1/3/2010 7 6 500 55407 1/4/2010 1/10/2010 8 6 500 55304 1/11/2010 1/13/2010 9 7 500 55407 1/14/2010 1/25/2010 10 8 500 55121 1/26/2010 2/9/2010 11 9 500 55119 2/10/2010 2/10/2010 12 10 500 55428 2/11/2010 2/11/2010 13 11 500 55038 2/12/2010 2/17/2010 14 12 500 55433 2/18/2010 3/8/2010 15 13 500 55406 3/9/2010 3/22/2010 16 14 500 55406 3/23/2010 3/24/2010 17 14 500 55433 3/25/2010 4/22/2010 18 15 500 55415 4/23/2010 6/20/2013 19 16 500 55106 6/21/2013 9/15/2013 20 17 500 55407 9/16/2013 9/19/2013 21 18 500 55407 9/20/2013 10/16/2013 22 18 500 55407 10/17/2013 11/25/2013 23 18 500 55102 11/26/2013 12/12/2013 24 19 500 55130 12/13/2013 1/21/2014 25 20 500 55407 1/22/2014 2/16/2014 26 21 500 55407 2/17/2014 7/10/2014 27 21 500 55125 7/11/2014 7/28/2014 28 22 500 55407 7/29/2014 10/29/2014 29 23 500 55411 10/30/2014 12/2/2014 30 24 500 55407 12/3/2014 7/7/2015 31 25 500 55434 7/8/2015 8/24/2015 32 26 500 55434 8/25/2015 11/3/2015 33 26 500 55130 11/4/2015 8/18/2016 34 27 500 55407 8/19/2016 7/11/2018 35 28 500 55407 7/12/2018 10/1/2018 36 28 500 55408 10/2/2018 10/5/2018 37 29 500 55411 10/6/2018 12/30/9999 38 30
Что я уже пробовал:
I have tried using the LEAD and LAG function to create the grouping column but no luck. Thanks Much!