根据 teradata 中的输入块值设置特定于 id 列的计数器值

Setting Counter value specific to an id column based on an input chunk value in teradata

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

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 中使用 window/analytical 函数来处理它。我们总是可以循环并根据 col1 值生成 col3 的值,但我正在寻找一个没有循环的查询级解决方案。可以吗

您可以在 cola 值上使用 DENSE_RANK() 来生成一个代表该值在列表中的顺序的数字,然后添加 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

Demo on dbfiddle