我可能不明白您所描述的一切。通过阅读您的问题和其他人的评论,我想这就是您要寻找的:
更新后的版本:
with cteOriginal as
(
select *, RANK() over (partition by [SortOrder] order by id asc) as [NonUniqueSortOrder]
from
(
select id, A as [value], 1 as [SortOrder]
from #original
where A is not null
union all
select id, B as [value], 2 as [SortOrder]
from #original
where B is not null
union all
select id, C as [value], 3 as [SortOrder]
from #original
where C is not null
union all
select id, D as [value], 4 as [SortOrder]
from #original
where D is not null
) as temp
)
select [value]
from cteOriginal
where id = (select MIN(tmp.id) from cteOriginal tmp where tmp.value = cteOriginal.value)
order by ((([NonUniqueSortOrder] - 1) * 4) + [SortOrder])
我通过选择具有最小id(min(id))的重复值来摆脱重复值。您可以将其更改为使用max(id)。
初始版本:
with cteOriginal as
(
select *, RANK() over (partition by [column] order by id asc) as [NonUniqueSortOrder]
from
(
select id, A as [value], 'A' as [Column], 1 as [SortOrder]
from #original
where A is not null
union all
select id, B as [value], 'B' as [Column], 2 as [SortOrder]
from #original
where B is not null
union all
select id, C as [value], 'C' as [Column], 3 as [SortOrder]
from #original
where C is not null
union all
select id, D as [value], 'D' as [Column], 4 as [SortOrder]
from #original
where D is not null
) as temp
)
select [value]
from cteOriginal
order by ((([NonUniqueSortOrder] - 1) * 4) + [SortOrder])