Как объединить записи на основе последовательных полей в Teradata - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть источник, подобный таблице ниже:

+---------+--+--------+--+---------+--+--+------+
|   ID    |  | SEQ_NO |  | UNIT_ID |  |  | D_ID |
+---------+--+--------+--+---------+--+--+------+
| 7979092 |  |      1 |  |      99 |  |  |  759 |
| 7979092 |  |      2 |  |      -1 |  |  |  869 |
| 7979092 |  |      3 |  |      -1 |  |  |  927 |
| 7979092 |  |      4 |  |      -1 |  |  |  812 |
| 7979092 |  |      5 |  |      99 |  |  |  900 |
| 7979092 |  |      6 |  |      99 |  |  |  891 |
| 7979092 |  |      7 |  |      -1 |  |  |  785 |
| 7979092 |  |      8 |  |      -1 |  |  |  762 |
| 7979092 |  |      9 |  |      -1 |  |  |  923 |
+---------+--+--------+--+---------+--+--+------+

Я должен объединить строки, когда последовательный unit_id имеет одинаковое значение. Мы должны взять max (D_id), когда мы объединяем строки. Ожидаемый результат:

+---------+---------+------+
|   ID    | UNIT_ID | D_ID |
+---------+---------+------+
| 7979092 |      99 |  759 |
| 7979092 |      -1 |  927 |
| 7979092 |      99 |  900 |
| 7979092 |      -1 |  923 |
+---------+---------+------+

Я пытался найти решение, используя упорядоченную аналитическую функцию Teradata, но не нашел решения. Я использую Teradata 16.

Спасибо.

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Этот лог c немного странный, он основан на двух последовательностях, созданных разными порядками сортировки:

SELECT
   ID
  ,UNIT_ID
  ,Max(D_ID)
FROM
 (
   SELECT
      ID
     ,SEQ_NO
     ,UNIT_ID
     ,D_ID
     -- assign the same value to consecutive UNIT_IDs
     ,SEQ_NO -
      Row_Number()
      Over(PARTITION BY ID, UNIT_ID 
           ORDER BY SEQ_NO) AS grp
   FROM tab
 ) AS dt
GROUP BY 1,2,grp
1 голос
/ 24 апреля 2020

Вы можете использовать RESET WHEN для динамического создания групп в окне. Вот один из способов сделать это:

select ID, UNIT_ID,
  max(D_ID) over(
    partition by ID order by SEQ_NO 
    reset when UNIT_ID <> UNIT_ID_prev -- Create new group for new value
  ) as D_ID
from (
  select ID, SEQ_NO, UNIT_ID, D_ID, 
    lag(UNIT_ID) over(partition by ID order by SEQ_NO) as UNIT_ID_prev -- Previous value
  from MY_TABLE
) src
qualify row_number() over(
  partition by ID order by SEQ_NO 
  reset when UNIT_ID <> UNIT_ID_prev -- Match original max() window
) = 1 -- One row per group (similar to DISTINCT)
...