根据 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
我有一个 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