Нормализовать набор чисел (удалить нули, последовательные дубликаты, сдвинуть оставшиеся значения влево) - PullRequest
0 голосов
/ 23 октября 2019

У меня есть строка данных с 5 числовыми столбцами. Я хочу:

Remove Zero/NULL values
Remove consecutive duplicates

После удаления Null / Duplicates, я хочу сместить оставшиеся значения влево - я не хочу сортировать значения.

Я предполагаючто первый параметр всегда не равен нулю / нулю.

Выходные данные будут иметь значения NULL вместо любых удаленных элементов. Поскольку оставшиеся значения сдвигаются влево, значения 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 извлекает данные, затем передает их функции, и функция (в настоящее время возвращающая таблицу) должна вести себя (я думаю) как двастолы, к которым присоединяются.

Моя функция ниже.

Буду признателен за ваш вклад в отношении моего общего подхода, и, если он звучит хорошо, ваши улучшения моей функции. Я также ищу функцию FUNCTION в операторе 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)
...