我已经看到了所有其他答案,但是还没有看到我解决的具体问题。基本上,我有一个包含一堆重复值的表,并且我需要精确地选择一个列(为了最终连接到一个列表,最终出于输出目的),但是该列表中有一个特定项是FIRST。我的问题是我可以指定顺序,也可以指定不同的,但不能同时指定两者。而且我不能在SELECT中包含order列,因为该输出将被直接使用,并且在输出中有两列会破坏所有内容。看来这应该可行,但是我不知道怎么做。
这是一个人为的例子:
DECLARE @List TABLE ([Name] nvarchar(10));
INSERT INTO @List ([Name])
VALUES (N'A'), (N'A'), (N'B'), (N'B'), (N'B'), (N'C'), (N'D'), (N'D'), (N'J'), (N'X'), (N'X'), (N'Y');
-- Has both duplicates, and not in the right order
SELECT * FROM @List;
-- No duplicates, but not in the right order
SELECT DISTINCT * FROM @List;
-- In the right order, but has duplicates
SELECT * FROM @List ORDER BY CASE WHEN [Name] = 'X' THEN '1' WHEN [Name] = 'Y' THEN '2' ELSE [Name] END;
我想要的是一个简单的输出,如下所示:
X
Y
A
B
C
D
J
我尝试了各种方法,包括CTE和中间步骤,但我真的只想选择一个,就可以放入STUFF中,因此得到的字符串为“ X,Y,A,B,C,D ,J”,而在执行此操作时,我找不到任何方法来保留必需的订单。这是有可能的,所以我显然缺少了一些东西……
答案 0 :(得分:5)
您应该使用分组依据,而不是与众不同。
SELECT [Name]
FROM @List
group by [Name]
ORDER BY CASE WHEN [Name] = 'X' THEN '1' WHEN [Name] = 'Y' THEN '2' ELSE [Name] END ;
答案 1 :(得分:0)
不幸的是,我没有足够的意见来发表评论,因此请尝试在“答案”中找出答案。
您已经提到您不应在结果集中包括排序列,因此我假设该列已在表格中定义。
如果是这样,则可以为此目的使用窗口功能。假设该列的名称为Ordering_Column
,那么您可以执行以下操作:
select Name
from (
select Name
, row_number() over (partition by Name order by Ordering_Column) as Position
from SomeTable
order by Ordering_Column
) where Position = 1
这将返回Name
中最前面的SomeTable
个值,并按Ordering_Column
排序。