2011-03-09 65 views
8

我已经在SQL 2008中创建了一个复杂的搜索查询,该查询返回按组排序的数据,查询本身具有分页和排序功能,而不是基于寻呼选项返回一定数量的记录,它需要返回一组数量(因此记录数量会有所不同)。如何在没有临时表的SQL查询中为组添加序列号

我目前正在通过使用临时表(第一个临时表创建将作为搜索的一部分选定的组的列表,然后对它们进行编号...并且第二个查询将其加入表到实际搜索...因此,它最终运行搜索查询两次)。

我正在寻找的是使用SQL 2008中的一些新功能(不需要使用临时表)的更有效的方法。

如果我能在这样的格式获得数据,我会设置...

 
Record Group  GroupSequence 
-------|---------|-------------- 
1  Chickens 1 
2  Chickens 1 
3  Cows  2 
4  Horses 3 
5  Horses 3 
6  Horses 3 

如何在SQL 2008单个查询做到这一点,任何的想法,而无需使用临时表?

+0

哪些列来自数据,哪些列需要计算值? – RichardTheKiwi 2011-03-09 23:00:44

+0

第一列和第二列(“记录[编号]”和“组”)来自数据。列“GroupSequence”将由查询计算。 – Jacob 2011-03-09 23:04:39

回答

10

的样本数据

create table sometable([group] varchar(10), id int, somedata int) 
insert sometable select 'Horses', 9, 11 
insert sometable select 'chickens', 19, 121 
insert sometable select 'Horses', 29, 123 
insert sometable select 'chickens', 49, 124 
insert sometable select 'Cows', 98, 1 
insert sometable select 'Horses', 99, 2 

查询

select 
    Record = ROW_NUMBER() over (order by [Group], id), 
    [Group], 
    GroupSequence = DENSE_RANK() over (order by [Group]) 
from sometable 

输出

Record    Group  GroupSequence 
-------------------- ---------- -------------------- 
1     chickens 1 
2     chickens 1 
3     Cows  2 
4     Horses  3 
5     Horses  3 
6     Horses  3 
+0

不错,显示row_number和dense_rank是如何工作的。 – 2011-03-09 23:07:01

+0

美丽! DENSE_RANK()正是我在找的东西,看起来比我使用的临时表更有效率。 – Jacob 2011-03-09 23:16:23

+0

正是文档为我订购的东西 - DENSE_RANK() – rageit 2012-07-27 20:09:04

1

没有你有,我想说一下到CTE查询和row_number功能......东西线沿线的表的详细信息:

;with groups as (
    select top 10 name, row_number() over(order by name) 'sequence' 
    from table1 
    group by name 
    order by name 
) 
select row_number() over(order by g.name) 'Record', 
    g.name 'GroupName', 
    g.sequence 'GroupSequence' 
from groups 
+0

出于分页的目的,我修改了大部分搜索查询以使用这个新的“与一起作为”符号,它似乎比@或#temp表的运行速度快得多。 – Jacob 2011-03-09 23:18:11

+0

要小心,因为这并非总是如此。在这种用法中,'with'查询符号就像一个命名子查询(可以多次使用)...所以有时候,临时表或表变量将是更好的选择。 – chezy525 2011-03-09 23:21:42