SQL Server-使用ROW_NUMBER()OVER PARTITION函数设置值

问题描述 投票:0回答:1

大家好,感谢您抽出宝贵时间调查我的问题,

背景

我正在使用ROW_NUMER()函数以及PARTITION BY..ORDER BY语句来为我的一个表中的每个值设置一个varchar值,并在其末尾增加一个int值。

SELECT  component_module_id as component_module_id,
        component_property_id,
        'cf' + CAST(ROW_NUMBER() OVER (PARTITION BY component_module_id ORDER BY component_module_id) as VARCHAR) AS cf
FROM component_property

这里'cf'值来自cf1-cfX,用于每个component_module_id

Sample Query Output

我的问题

[每当我尝试在其他地方使用这些cf值时,例如保存在临时表中,其他Ordering和Grouping语句都会更改这些值。就像生成“ cf”值的语句被保存,而不是“ cf”值本身的保存。

将上面的查询插入临时表#t之后-

SELECT * FROM #t ORDER BY cf

我收到从cf1开始并跳转到cf10然后是cf100的'cf'值,其cf值范围从cf1到cf900 ...我应该只接收从c1到cf29范围内的值。

我的问题是-为什么此列中的值与其他任何正常值都不同?为什么将ROW_NUMBER()OVER(PARTITION BY ....))计算传递给该行的进一步查询? (如果实际上是这种情况)。最后,当我尝试按它们分组或排序时,如何将这些“ cf”值视为正常的VARCHAR值,并且不让它们发生变化。

感谢您的帮助!

sql sql-server row-number partition-by
1个回答
0
投票
尝试一下

SELECT component_module_id, component_property_id, 'cf' + CAST(cf) AS VARCHAR(10) FROM ( SELECT component_module_id, component_property_id, ROW_NUMBER() OVER (PARTITION BY component_module_id ORDER BY component_module_id) AS cf FROM component_property ) a

您正在经历的行为是VARCHAR如何对数字进行排序(它具有名称,但它使我不知道)

您需要作为INT进行排序,然后在最后进行串联(通过将原始查询包装在子查询中


0
投票
如果您这样操作,它将起作用

SELECT * FROM #t ORDER BY component_module_id, cast(replace(cf, 'cf', '') as int)

© www.soinside.com 2019 - 2024. All rights reserved.