如何在Teradata中基于连续字段合并记录
我有一个如下表所示的来源:如何在Teradata中基于连续字段合并记录,teradata,Teradata,我有一个如下表所示的来源: +---------+--+--------+--+---------+--+--+------+ | ID | | SEQ_NO | | UNIT_ID | | | D_ID | +---------+--+--------+--+---------+--+--+------+ | 7979092 | | 1 | | 99 | | | 759 | | 7979092 | | 2 | | -1 |
+---------+--+--------+--+---------+--+--+------+
| 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 |
+---------+--+--------+--+---------+--+--+------+
当连续的单元id具有相同的值时,我必须合并行。我们应该在合并行时使用maxD_id。预期产出为:
+---------+---------+------+
| ID | UNIT_ID | D_ID |
+---------+---------+------+
| 7979092 | 99 | 759 |
| 7979092 | -1 | 927 |
| 7979092 | 99 | 900 |
| 7979092 | -1 | 923 |
+---------+---------+------+
我曾尝试使用Teradata有序分析函数找到解决方案,但没有找到解决方案。我使用Teradata 16
谢谢。您可以在窗口内动态创建组时使用重置。这里有一种方法:
选择ID,单元ID,
maxD_ID超过
按ID划分按序号排序
当UNIT\u ID UNIT\u ID\u prev-为新值创建新组时重置
作为D_ID
从…起
选择ID、序号、单元ID、数据ID、,
lagUNIT\u ID根据ID订单按序号超额分配为UNIT\u ID\u prev-以前的值
从我的桌子上
src
将行号限定在
按ID划分按序号排序
当UNIT\u ID UNIT\u ID\u prev-匹配原始最大窗口时重置
=1-每组一行,类似于DISTINCT
在窗口内动态创建组时,可以使用“重置”。这里有一种方法:
选择ID,单元ID,
maxD_ID超过
按ID划分按序号排序
当UNIT\u ID UNIT\u ID\u prev-为新值创建新组时重置
作为D_ID
从…起
选择ID、序号、单元ID、数据ID、,
lagUNIT\u ID根据ID订单按序号超额分配为UNIT\u ID\u prev-以前的值
从我的桌子上
src
将行号限定在
按ID划分按序号排序
当UNIT\u ID UNIT\u ID\u prev-匹配原始最大窗口时重置
=1-每组一行,类似于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
这种逻辑有点奇怪,它基于由不同排序顺序创建的两个序列:
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
序列号实际上是一个没有间隙的序列吗?是@dnoeth。它基本上是一个派生字段,充当序列板。序列号实际上是一个没有间隙的序列?是@dnoeth。它基本上是派生字段,充当SKDNOETH,感谢您的回复。根据此sql,行号将单位ID为-1的组分为一个数字,将单位ID为99的组分为另一组。但我希望在更改UNIT_ID的值时创建唯一的组号。我尝试使用这个-,sumcase,当UNIT_ID UNIT_ID_prev然后1 else 0结束于按ID划分的分区,UNIT_ID按SEQ排序,前面没有无界行。但是它没有提供所需的输出。你真的运行了我的查询吗?只要运行内部选择,就可以看到在机组id发生变化时如何分配新的grp。很抱歉,您总是对的!我以前的SQL有一个问题。它的工作原理和预期的一样好!!谢谢你的回复。根据此sql,行号将单位ID为-1的组分为一个数字,将单位ID为99的组分为另一组。但我希望在更改UNIT_ID的值时创建唯一的组号。我尝试使用这个-,sumcase,当UNIT_ID UNIT_ID_prev然后1 else 0结束于按ID划分的分区,UNIT_ID按SEQ排序,前面没有无界行。但是它没有提供所需的输出。你真的运行了我的查询吗?只要运行内部选择,就可以看到在机组id发生变化时如何分配新的grp。很抱歉,您总是对的!我以前的SQL有一个问题。它的工作原理和预期的一样好!!谢谢你的解决方案。当我将sql更改为在单个查询中使用max和QUICITE时,您的sql运行良好。感谢您的解决方案。当我将sql更改为在单个查询中使用max和qualify时,您的sql运行良好。