如何根据 Teradata 中的连续字段合并记录

How to merge records based on consective fields in Teradata

我有如下来源 table:

+---------+--+--------+--+---------+--+--+------+
|   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.

谢谢。

您可以使用 RESET WHEN 在 window 中动态创建组。这是一种方法:

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)

这个逻辑有点古怪,它基于由不同排序顺序创建的两个序列:

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