2011-03-09 50 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