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

Posted

技术标签:

【中文标题】如何在没有临时表的 SQL 查询中为组添加序列号【英文标题】:How to add sequence number for groups in a SQL query without temp tables 【发布时间】:2011-03-09 22:55:39 【问题描述】:

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

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

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

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

记录组 GroupSequence --------|----------|-------------- 1 鸡 1 2 鸡 1 3 奶牛 2 4 马 3 5 马 3 6 马 3

关于如何在 SQL 2008 中使用单个查询而不使用临时表来完成此任务的任何想法?

【问题讨论】:

哪些列来自数据,哪些需要计算值? 第一列和第二列(“Record[Number]”和“Group”)来自数据。 “GroupSequence”列将由查询计算。 【参考方案1】:

样本数据

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

【讨论】:

漂亮! DENSE_RANK() 正是我想要的,而且似乎比我使用的临时表更有效。 正是文档为我订购的内容 - DENSE_RANK() 如果组中只有一个字段,这可以工作。但是如果多个字段定义一个组呢?【参考方案2】:

如果没有关于您拥有的表的更多详细信息,我会说查看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

【讨论】:

出于分页的目的,我修改了大部分搜索查询以使用这种新的“with as”表示法,它的运行速度似乎比 @ 或 # 临时表快得多. 小心,因为这并不总是正确的。 with 查询符号,在这种用法中,就像一个命名子查询(可以多次使用)......所以有时,临时表或表变量会是更好的选择。

以上是关于如何在没有临时表的 SQL 查询中为组添加序列号的主要内容,如果未能解决你的问题,请参考以下文章

使用 Oracle SQL 查询为组中的每个元素添加序列号

如何在 laravel 查询生成器中为 sql 选择列添加别名?

如何在 JavaFX 中为组布局添加背景颜色?

在Ansible中为组添加公共变量的位置

SQL如何把查询出来的多个表创建成一个临时表

SQL 中将游标循环查询的结果插入到临时表中