首页 > 解决方案 > 根据 teradata 中的输入块值设置特定于 id 列的计数器值

问题描述

我有一个具有以下数据分布的表:

cola colb 
id1     a
id1     b
id2     c
id2     d
id3     e
id3     f
id4     g
id4     h

我正在尝试根据我将作为输入传递的块值创建一个额外的 id 字段:例如在这种情况下为 2 。所以,我的最终结果看起来像这样:

cola colb col_new_id
id1     a        1
id1     b        1
id2     c        1
id2     d        1
id3     e        2
id3     f        2
id4     g        2
id4     h        2

有没有办法使用 teradata 中的窗口/分析函数来处理它。我们总是可以循环并根据 col1 值生成 col3 的值,但我正在寻找不循环的查询级别解决方案。有没有可能。

标签: sqldatabaseteradata

解决方案


您可以使用DENSE_RANK()这些cola值生成一个数字,该数字表示该值在列表中的顺序,然后添加chunk - 1和整数除以chunk创建该col_new_id值。例如:

DECLARE @chunk INT;
SET @chunk = 2;
SELECT cola, colb, 
       (DENSE_RANK() OVER (ORDER BY cola) + @chunk - 1) / @chunk AS col_new_id
FROM data

输出:

cola    colb    col_new_id
id1     a       1
id1     b       1
id2     c       1
id2     d       1
id3     e       2
id3     f       2
id4     g       2
id4     h       2

dbfiddle 上的演示


推荐阅读