Выбор строк, в которых значения в одном столбце отличаются, значения других столбцов и столбцов даты являются правильными - PullRequest
1 голос
/ 04 февраля 2020

Предположим, у меня есть следующие столбцы: ID, код, DST, Short_text, Long_text, Date_from, Date_until

Вот набор данных:

ID  Code    DST   Short_text      Long_text     Date_From    Date_Until

1   B 01    B 1     Bez1           Bezirk1       29.10.1999   13.01.2020
1   B 01    B 1     Bez1           Bezirk1       14.01.2020   31.12.9999 
2   B 02    B 2     Bez2           Bezirk2       29.10.1999   13.01.2020 
3   B 03    B 3     Bez3           Bezirk3       14.01.2020   31.12.9999 
4   B 04    B 4     Bez4           Bezirk4       29.10.1999   13.01.2020  
4   B 04    B 4     Bez4           Bezirk4       14.01.2020   31.12.9999 
97  M 51    M 52    MA 51          Sport         29.10.1999   13.01.2020 
96  M 51    M 51    MA 51          Sport         14.01.2020   31.12.9999 
98  M 55    M 53    MA 53          Dance         29.10.1999   13.01.2020 
99  M 55    M 54    MA 54          Skating       14.01.2020   31.12.9999 
100 M 56    M 59    MA 57          Football      29.10.1999   13.01.2020 
101 M 56    M 56    MA 56          Tennis        29.10.1999   31.12.9999

Я хочу выбрать строки, такие что у них разные ID И (у них одинаковый код ИЛИ SImilar Short_text ИЛИ simmlar long_text) И Правильный Date_from - Date_Until.

Определение правильного Date_from - Date_Until:

1.Date_ from < Date_Until
2.Both fields are not Null
3. WHEN PREV_DATE_UNTIL = DATE_FROM - 1 OR PREV_DATE_UNTIL is null THEN 'OK'(PREV_DATE_UNTIL using lag operator)
4. WHEN NEXT_DATE_FROM = DATE_UNTIL + 1 OR NEXT_DATE_FROM is null THEN 'OK'(NEXT_DATE_FROM using lead operator)

Не правильно:

WHEN WHEN NEXT_DATE_FROM > DATE_UNTIL + 1 THEN 'Gaps in Dates'
WHEN WHEN NEXT_DATE_FROM < DATE_UNTIL + 1 THEN 'Overlapping dates'

По сути, я имею в виду, что историзация данных должна быть правильной (без наложения)

В конце я хочу выбрать следующие строки:

97  M 51    M 52    MA 51          Sport         29.10.1999   13.01.2020 
96  M 51    M 51    MA 51          Sport         14.01.2020   31.12.9999 

Поскольку они имеют разные ID и схожий код или short_text или long_text, а даты являются правильными согласно определению

И

98  M 55    M 53    MA 53          Dance         29.10.1999   13.01.2020 
99  M 55    M 54    MA 54          Skating       14.01.2020   31.12.9999

Потому что они имеют разные идентификаторы и аналогичные коды и даты являются правильными в соответствии с определением

Строки:

100 M 56    M 59    MA 57          Football      29.10.1999   13.01.2020 
101 M 56    M 56    MA 56          Tennis        29.10.1999   31.12.9999

НЕ должны выбираться, поскольку они имеют разные идентификаторы и схожие коды, НО они имеют Даты и т. д. (они перекрываются).

1 Ответ

1 голос
/ 04 февраля 2020

Это будет примерно так:

with t as (
  select row_number() over (order by date_from, date_until) rn, 
         id, code, dst, short_text, long_text, date_from, 
         nullif(date_until, date '9999-12-31') date_until 
    from data)
select rna, rnb, description, t.* 
  from t 
  join (
    select a.rn rna, b.rn rnb,
           case when b.date_from = a.date_until + 1 then 'OK'
                when b.date_from > a.date_until + 1 then 'gaps'
                when b.date_from < a.date_until + 1 then 'overlapping'
           end description
      from t a 
      join t b on a.id <> b.id and a.rn < b.rn
              and (a.code = b.code or a.short_text = b.short_text 
                                   or a.long_text = b.long_text)) pairs
        on rn in (rna, rnb)

результат:

   RNA    RNB DESCRIPTION    RN         ID CODE DST  SHORT_TEXT LONG_TEXT DATE_FROM   DATE_UNTIL
------ ------ ----------- ----- ---------- ---- ---- ---------- --------- ----------- -----------
     1      7 overlapping     1        100 M 56 M 59 MA 57      Football  1999-10-29  2020-01-13
     1      7 overlapping     7        101 M 56 M 56 MA 56      Tennis    1999-10-29  
     3      8 OK              3         98 M 55 M 53 MA 53      Dance     1999-10-29  2020-01-13
     3      8 OK              8         99 M 55 M 54 MA 54      Skating   2020-01-14  
     6      9 OK              6         97 M 51 M 52 MA 51      Sport     1999-10-29  2020-01-13
     6      9 OK              9         96 M 51 M 51 MA 51      Sport     2020-01-14

dbfiddle

Я пронумеровал строки, самостоятельно соединил такие данные и одел ваши логики c в синтаксисе case when. Я проверял на ваших примерах, в случае каких-либо ошибок, пожалуйста, укажите dbfiddle , если это возможно.

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