Sql server 规范化一组数字(删除空值、连续重复值、将剩余值向左移动)
我有一个包含5个数字列的数据行。 我想:Sql server 规范化一组数字(删除空值、连续重复值、将剩余值向左移动),sql-server,function,normalization,Sql Server,Function,Normalization,我有一个包含5个数字列的数据行。 我想: Remove Zero/NULL values Remove consecutive duplicates 删除空值/重复值后,我希望将剩余值向左移动-我不希望对值进行排序 我假设第一个参数总是非零/Null 输出将使用空值代替任何已删除的元素。由于剩余值向左移动,因此空值仅存在于输出的右端 以下是一些示例: 10,20,30,40,50 = 10,20,30,40,50 50,20,30,40,50 = 50,20,30,40,50 10,10,20
Remove Zero/NULL values
Remove consecutive duplicates
删除空值/重复值后,我希望将剩余值向左移动-我不希望对值进行排序
我假设第一个参数总是非零/Null
输出将使用空值代替任何已删除的元素。由于剩余值向左移动,因此空值仅存在于输出的右端
以下是一些示例:
10,20,30,40,50 = 10,20,30,40,50
50,20,30,40,50 = 50,20,30,40,50
10,10,20,30,50 = 10,20,30,50,NULL
10,10,20,10,50 = 10,20,10,50,NULL
10,10,00,10,50 = 10,50,NULL,NULL,NULL
10,10,10,10,10 = 10,NULL,NULL,NULL,NULL
10,00,10,00,10 = 10,NULL,NULL,NULL,NULL
我正在使用CTE在存储过程中构建一个解决方案,但最终决定尝试编写一个函数
该函数工作正常,但编写得很差。此外,我不确定如何将函数合并到存储过程中,在存储过程中,泛型SELECT将数据拉入,然后将其馈送给函数,并且函数(当前返回一个表)的行为(我认为)应该类似于两个表的连接
我的功能如下
我将感谢您对我的整体方法的意见,如果它是合理的,您对我的功能的改进。将函数连接到SELECT语句中,我也在寻找
多谢各位
create function ColumnShifter (@1 decimal,@2 decimal,@3 decimal,@4 decimal,@5 decimal)
RETURNS TABLE
AS
RETURN
WITH ROUND1 AS(
Select
@1 [1]
,coalesce(@2,@3,@4,@5) [2]
,coalesce(@3,@4,@5) [3]
,coalesce(@4,@5) [4]
,@5 [5])
,ROUND2 AS (
Select
[1]
,NULLIF([2],[1]) [2]
,NULLIF([3],[2]) [3]
,NULLIF([4],[3]) [4]
,NULLIF([5],[4]) [5]
from
Round1 )
,ROUND3 AS (
Select
[1]
,coalesce([2],[3],[4],[5]) [2]
,coalesce([3],[4],[5]) [3]
,coalesce([4],[5]) [4]
from
Round2 )
,ROUND4 AS (
Select
[1]
,NULLIF([2],[1]) [2]
,NULLIF([3],[2]) [3]
,NULLIF([4],[3]) [4]
from
Round3 )
,ROUND5 AS (
Select
[1]
,coalesce([2],[3],[4]) [2]
,coalesce([3],[4]) [3]
,[4]
from
Round4 )
,ROUND6 AS (
Select
[1]
,NULLIF([2],[1]) [2]
,NULLIF([3],[2]) [3]
,NULLIF([4],[3]) [4]
from
Round5 )
select * from ROUND6
GO
Select * from ColumnShifter(10,10,20,20,100)
通过
10,10,10,10,10,10=10
您的意思是10,10,10,10,10
应该显示为10,NULL,NULL,NULL,NULL
?是-但是我觉得排除NULL会使示例输出更清晰。例如,我的源示例中没有包含NULL数据。我会注意到你在问题中的观察。“但是我觉得排除空值会使示例输出更清晰。”但这并不会让它变得不那么清晰。你的意思是说我现在不知道10,10,00,10,50
现在应该是10,NULL,50,NULL,NULL
,还是10,50,NULL,NULL,NULL
。你的预期结果应该反映你的需求。否则,看起来您希望返回的数据集中某些行的列更少;这是不可能的(因为这是不允许的),我会根据您的顾虑更新问题。