SQL如何使用distinct来订购数据?

时间:2015-08-11 08:25:53

标签: sql

我有以下表'tbl1'。

声明@ tbl1表(col1 varchar(32))

insert into @tbl1
values    ( 'C1' )
        , ( 'B1' )
        , ( 'X1' )
        , ( 'A1' )
        , ( 'B1' )
        , ( 'C1' )
        , ( 'B1' )
        , ( 'A1' )
        , ( 'X1' )
        , ( 'C1' )
        , ( 'D1' )

我尝试了以下查询

select distinct col1
from @tbl1
order by col1

输出应按以下顺序排列,并删除所有重复值

C1
B1
X1
A1
D1

4 个答案:

答案 0 :(得分:1)

您需要指定商品的订单,正如其他人所说的那样。

此外,您还需要子查询和分组才能对最小订单列进行排序。

declare @source table (id int not null identity primary key, name nvarchar(3));
insert into @source
values    ( 'C1' )
        , ( 'B1' )
        , ( 'X1' )
        , ( 'A1' )
        , ( 'B1' )
        , ( 'C1' )
        , ( 'B1' )
        , ( 'A1' )
        , ( 'X1' )
        , ( 'C1' )
        , ( 'D1' )
;
with grouped as
(
    select min(id) as minId, name from @source
    group by name
)
select name from grouped order by minId;

可以在没有CTE的情况下重写查询:

select grouped.name from
    (select min(id) as minId, name from @source group by name) grouped
order by grouped.minId;

这恰好产生了您请求的结果。

答案 1 :(得分:0)

重复其他人在评论中指出的内容:如果您未指定ORDER,则无法保证结果的顺序。您目前以特定顺序获得结果的事实应该被视为巧合。 如果您想在结果中进行某种排序,您必须明确

有趣的是,根据我的经验,如果您在查询中执行DISTINCT,这一点尤其重要,因为根据您的表的统计信息,引擎可能会也可能不会决定对数据进行排序执行DISTINCT实际上是最好的计划。

鉴于你提到非常明确的订购要求......

  

输出应按以下顺序排列,并删除所有重复值

C1
B1
X1
A1
D1

...你应该在你的查询中明确说明:

SELECT DISTINCT 
        *, 
        CASE 
            WHEN Col1 = 'C1' THEN 0
            WHEN Col1 = 'B1' THEN 1
            WHEN Col1 = 'X1' THEN 2
            WHEN Col1 = 'A1' THEN 3
            WHEN Col1 = 'D1' THEN 4
            ELSE 5
        END AS SortColumn
FROM tbl1
ORDER BY SortColumn

答案 2 :(得分:0)

(Jeroen响应的扩展)

如果您的“关键”值是动态的,那么您通常应该有一个单独的表格,其中包含键的顺序......

declare @sort table (id varchar(10), ord int)

insert into @sort
values ( 'C1', 1 )
     , ( 'X1', 2 )
     , ( 'B1', 3 )
     , ( 'A1', 4 )
     , ( 'D1', 5 )

然后你在该表上加入/子查询来计算SortColumn

-- join
SELECT DISTINCT 
        t.*, 
        s.ord SortColumn
FROM @tbl1 t
LEFT JOIN @sort s ON S.id = t.col1
ORDER BY SortColumn

-- subquery
SELECT DISTINCT 
        t.*, 
        (SELECT s.ord FROM @sort s WHERE s.id = t.col1) SortColumn
FROM @tbl1 t
ORDER BY SortColumn

答案 3 :(得分:-1)

declare @tbl1 table ( col1 varchar(32))

insert into @tbl1
values    ( 'Basic Salary' )
        , ( 'HRA' )
        , ( 'OtherAllowance' )
        , ( 'PF' )
        , ( 'Basic Salary' )
        , ( 'HRA' )
        , ( 'Other Allowance' )
        , ( 'PF' )
        , ( 'ESIC' )
        , ( 'Basic Salary' )
        , ( 'HRA' )
        , ( 'Other Allowance' )
        , ( 'PF' )
        , ( 'Basic Salary' )

select distinct col1
from @tbl1
order by col1