如何使用SELECT DISTINCT指定特定的自定义顺序

时间:2018-08-07 19:43:46

标签: sql-server tsql

我已经看到了所有其他答案,但是还没有看到我解决的具体问题。基本上,我有一个包含一堆重复值的表,并且我需要精确地选择一个列(为了最终连接到一个列表,最终出于输出目的),但是该列表中有一个特定项是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”,而在执行此操作时,我找不到任何方法来保留必需的订单。这是有可能的,所以我显然缺少了一些东西……

2 个答案:

答案 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排序。