Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Teradata中基于连续字段合并记录_Teradata - Fatal编程技术网

如何在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运行良好。