【发布时间】:2020-08-14 08:55:43
【问题描述】:
declare @RuleTable table (RuleId int, Pattern varchar(max) , Frequency int )
insert into @RuleTable
select 1, '3,5,4,6' , 2
SELECT
ROW_NUMBER() OVER(PARTITION BY items ORDER BY (select 1)) - 1 AS Id,
RuleId,
items AS ShiftId
FROM @RuleTable
CROSS APPLY SplitNew(REPLICATE(REPLACE(','+ LTRIM(RTRIM(Pattern)) +',',',0,',',') +',', Frequency ), ',') as ss
当前的输出是这样的……
但在预期的输出中,我不应该丢失逗号分隔字符串的顺序
意味着输出应该是这样的
ShiftId
3
3
5
5
4
4
6
6
注意:频率表示逗号分隔字符串中的每个 shiftid 应重复多少次。
【问题讨论】:
-
什么是
SplitNew?这不是内置的 TVF(我怀疑是问题所在,因为它不考虑序数位置)。但是,您的查询不包含ORDER BY,因此行可以按 SQL Server 想要返回的任意顺序排列。如果您希望按特定顺序排列行,则需要包含ORDER BY -
请注意,您的子句
ORDER BY (SELECT 1)是没有意义的,这也可能意味着“将行以任意顺序排列”,并且分区中的每一行都将具有相同的值,因此都可以相同地具有有机会出现在小组的开始、结束或中间。
标签: sql sql-server csv