【发布时间】:2021-09-24 02:03:57
【问题描述】:
我需要根据一列中的数据创建一个序列,示例表如下:
id | group
101| bfd
102| bfd
123| klm
563| kln
693| klm
要提供的序列是这样的,如果 group = bfd 那么 new_id = id + 中的序列 如果 group = klm 或 kln 则 new_id = id +
中的序列输出应该是这样的:
id | group | new_id
101| bfd | 1010
102| bfd | 1021
123| klm | 123201
563| kln |563202
693| klm | 693203
我尝试了以下代码
select * from(
SELECT id, group,
CASE
WHEN group in 'bfd' THEN concat(ID, -1 +ROW_NUMBER() OVER(PARTITION BY group order by ID))
WHEN group='klm' or group="kln" THEN concat(ID, 200 + ROW_NUMBER() OVER(PARTITION BY group order by id))
END as new_id
FROM table2)
order by id;
如何为特定组提供行号停止在 200 处的限制条件?
【问题讨论】:
-
如果有201个bfd你会怎么做?反复使用200?不为所有后续的内容添加任何内容?
-
为什么你认为你甚至需要这个新的 ID 列?请注意,即使您在这里得到了答案,如果您的表数据发生变化,或者应该添加新数据,您也可能需要重新计算新的 ID 列。
-
顺便说一句,在您的预期输出中,您将
klm和kln视为具有相同运行顺序的同一组。但是您的查询无法处理OVER(PARTITION BY group order by id) -
同意松鼠,也许你应该有一个
LEFT(group,1)作为你的分区 -
你需要解释如果除了上面提到的组之外还有其他组并且当组中的行数超过200时会发生什么。
标签: sql sql-server database tsql