假设我有这样的数据:每组选择一行而不指定顺序?
create table People (ID int identity, Name nvarchar(50), Age int);
insert into People values
('Bill Jones', 50),
('Bill Jones', 12),
('Sam Smith', 23),
('Jill Brown', 44),
('Jill Brown', 67),
('Jill Brown', 3)
而这个查询:
select * from (
select
ID, Name, Age,
row_number() over (partition by Name order by ID) [rownum]
from People
) a where [rownum] = 1
它成功地返回我每唯一名称一人。
ID NAME AGE ROWNUM
1 Bill Jones 50 1
4 Jill Brown 44 1
3 Sam Smith 23 1
但是为了使用row_number()
,我都必须指定一个order by
,引起查询计划包括昂贵的排序操作。
我不关心返回其人;我只需要每个名字一个人。
有没有办法做到这一点没有排序?
你可以在这里看到我的查询和执行计划:http://sqlfiddle.com/#!3/3ee32/1/0
尝试使用'order by 1/0',一个假的排序。它可能在QO上游戏足以放弃排序。 – RichardTheKiwi 2013-05-01 05:06:39
排序并不总是很昂贵,并且不相信查询计划中的%s。你也可以尝试变种'选择身份证号码,姓名,年龄,身份证号码(从姓名分组中选择人名分钟)(ID)' – RichardTheKiwi 2013-05-01 05:10:02
我认为我实际上是个白痴......无论如何,为了分割。更改为'1/0的顺序'确实会停止它通过ID *以及* Name排序。 – Blorgbeard 2013-05-01 05:17:09