Группируйте данные в разные разделы, хотя разные повторяющиеся значения - PullRequest
0 голосов
/ 06 марта 2019

У меня есть данные, подобные этому:

Arrange Id  |  Begin Date | End Date | Dept Id
------------+-------------+----------+-----------
 11345         01/02/2001   02/03/2003   2230
 11345         02/03/2004   04/05/2005   2230
 11345         04/06/2005   06/06/2006   2210
 11345         05/06/2007   07/09/2008   2210
 11345         08/09/2009   11/23/2010   2230
 11454         04/01/2008   04/07/2008   1100
 11454         04/08/2008   05/06/2009   1100
 11454         05/07/2009   07/09/2010   1300
 11454         08/07/2011   10/23/2012   1100

Ожидаемый результат:

 Arrange Id | Begin Date | End Date    | Dept Id
------------+-------------+----------+-----------
 11345        01/02/2001   04/05/2005   2230
 11345        04/06/2005   07/09/2008   2210
 11345        08/09/2009   11/23/2010   2230
 11454        04/01/2008   05/06/2009   1100
 11454        05/07/2009   07/09/2010   1300
 11454        08/07/2011   10/23/2012   1100

Я хочу, чтобы данные были разбиты на основе Arrange Id, мне нужно взять Min(Begin Date), Max(End Date) даты для каждого Arrange id, Dept Id .. Но Dept Id повторяется, как первоначально 6620, 6630, 6640, затем снова 6620 и т. Д.

Мне нужно показать значения в соответствии с ожидаемым выводом, показанным выше. Если я разделю на основе группы Arrange Id, Dept Id, например, в приведенном выше случае 11345, 2230 dept id Я получаю одно значение, но мне нужны два разных значения, как показано выше ..

Кто-нибудь может мне помочь с этим решением, написав SQL-запрос (для Oracle)?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Это проблема пробелов и островов, где вы должны объединить начало и конец.

Идея состоит в том, чтобы найти строки, которые начинают остров.Вы можете сделать это, найдя «начало», которое не перекрывается с существующими строками.Затем накапливаем их количество и объединяем:

select arrange_id, dept_id, min(begin_date), max(end_date)
from (select t.*,
             sum(case when prev_end_date >= begin_date then 0
                      else 1
                 end) over (partition by arrange_id, dept_id) as grp
      from (select t.*,
                   max(end_date) over (partition by arrange_id, dept_id
                                       order by begin_date, end_date
                                       rows between unbounded preceding and 1 preceding
                                      ) as prev_end_date
            from t
           ) t
      ) t
group by arrange_id, dept_id, grp;
0 голосов
/ 06 марта 2019

ОК, так что вы должны поддерживать порядок своего набора, чтобы делать то, что вы хотите. Поэтому я использую номер строки и ранг, чтобы найти конкретные острова, которые вы ищете. Это основывается на предположении, что ваши группы разделены другими ArrangeID:

SELECT arrangeid, 
       MIN(begindate) AS BEGINDATE, 
       MAX(enddate)   AS ENDDATE, 
       deptid 
FROM  
    (
        SELECT arrangeid, 
               begindate, 
               enddate, 
               deptid, 
               DENSE_RANK() OVER (PARTITION BY arrangeid, deptid ORDER BY rn) AS grp 
        FROM   (
                SELECT arrangeid, 
                       begindate, 
                       enddate, 
                       deptid, 
                       ROW_NUMBER() OVER ( PARTITION BY arrangeid ORDER BY begindate) -
                       RANK() OVER ( PARTITION BY arrangeid, deptid ORDER BY begindate) AS rn 
                FROM   arrange
                ) rawdata
    ) ranked 
GROUP  BY arrangeid, 
          deptid, 
          grp 
ORDER  BY arrangeid, 
          deptid 

Что дает вывод:

ARRANGEID   BEGINDATE               ENDDATE                 DEPTID
11345       2005-04-06T00:00:00Z    2008-07-09T00:00:00Z    2210    
11345       2009-08-09T00:00:00Z    2010-11-23T00:00:00Z    2230
11345       2001-01-02T00:00:00Z    2005-04-05T00:00:00Z    2230
11454       2008-04-01T00:00:00Z    2009-05-06T00:00:00Z    1100
11454       2009-05-07T00:00:00Z    2010-07-09T00:00:00Z    1300
11454       2011-08-07T00:00:00Z    2012-10-23T00:00:00Z    1100

Вы можете найти здесь скрипку: http://sqlfiddle.com/#!4/17b162/49

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...