Sql server 规范化一组数字(删除空值、连续重复值、将剩余值向左移动)

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

我有一个包含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,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
。你的预期结果应该反映你的需求。否则,看起来您希望返回的数据集中某些行的列更少;这是不可能的(因为这是不允许的),我会根据您的顾虑更新问题。