如何在没有临时表的SQL查询中为组添加序列号

如何在没有临时表的SQL查询中为组添加序列号,sql,tsql,sql-server-2008,grouping,Sql,Tsql,Sql Server 2008,Grouping,我在SQL 2008中创建了一个复杂的搜索查询,它返回按组排序的数据,查询本身具有分页和排序功能,但它需要返回一组组(因此记录的数量会有所不同),而不是根据分页选项返回一组数目的记录 我目前通过使用临时表来实现这一点(第一个临时表创建一个组列表,这些组将作为搜索的一部分被选择,然后对它们进行编号…第二个查询将此表与实际搜索连接起来…因此,它最终运行搜索查询两次) 我正在寻找的是一种更有效的方法,可以使用SQL 2008中的一些新函数(不需要使用临时表) 如果我能以这样的格式获取数据,我会被设置为

我在SQL 2008中创建了一个复杂的搜索查询,它返回按组排序的数据,查询本身具有分页和排序功能,但它需要返回一组组(因此记录的数量会有所不同),而不是根据分页选项返回一组数目的记录

我目前通过使用临时表来实现这一点(第一个临时表创建一个组列表,这些组将作为搜索的一部分被选择,然后对它们进行编号…第二个查询将此表与实际搜索连接起来…因此,它最终运行搜索查询两次)

我正在寻找的是一种更有效的方法,可以使用SQL 2008中的一些新函数(不需要使用临时表)

如果我能以这样的格式获取数据,我会被设置为

Record Group GroupSequence -------|---------|-------------- 1 Chickens 1 2 Chickens 1 3 Cows 2 4 Horses 3 5 Horses 3 6 Horses 3 记录组分组序列 -------|---------|-------------- 1鸡1 2只鸡1只 3头母牛2头 4匹马3 5匹马3 6匹马3
关于如何在不使用临时表的情况下通过SQL 2008中的单个查询实现这一点,您有什么想法吗?

如果没有关于现有表的更多详细信息,我会说查看查询和函数。。。大致如下:

;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
样本数据

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
质疑

输出

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

哪些列来自数据,哪些需要计算值?第一列和第二列(“记录[编号]”和“组”)来自数据。“GroupSequence”列将由查询计算。太棒了!DENSE_RANK()正是我所寻找的,而且似乎比我使用的临时表要高效得多。正如文档为我排序的一样-DENSE_RANK()如果组中只有一个字段,这就可以工作。但是如果多个字段定义了一个组怎么办?出于分页的目的,我修改了大多数搜索查询,使用了新的“with as”表示法,它的运行速度似乎比@或#temp表快得多。请小心,因为这并不总是正确的。在这种用法中,带有查询符号的
类似于一个命名的子查询(可以多次使用)。。。因此,有时,临时表或表变量将是更好的选择。
Record               Group      GroupSequence
-------------------- ---------- --------------------
1                    chickens   1
2                    chickens   1
3                    Cows       2
4                    Horses     3
5                    Horses     3
6                    Horses     3