sql - 根据 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 的值,但我正在寻找不循环的查询级别解决方案。有没有可能。
解决方案
您可以使用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
推荐阅读
- powershell - 使用 Powershell 通过 Gmail 发送 SMTP 邮件
- javascript - 在从函数返回的对象上使用 ES6 扩展运算符
- azure - Terraform Azure AKS 内部负载均衡器
- c# - 在数据库中显示名称值而不是 ID
- python - 使用 Python 解析 XML:将文本保留在属性内,同时删除其周围的标签
- shell - ZSH 在打开应用程序选项卡自动完成时挂起
- python - 我可以使用带有变量名的 Pandas Dataframe.assign(...)
- javascript - 如何使用 ngFor 和 ngModel 绑定输入值?
- powershell - 为什么个人访问令牌 (PAT) 需要完全访问权限才能为 Azure DevOps REST API 提供服务?
- terraform - 如何在 Terraform 中引用 for_each 创建的资源