У меня есть строка данных с 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)