我有以下表'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
答案 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