2011-03-09 13 views
8

SQL 2008'de, gruplara göre sıralanmış verileri döndüren karmaşık bir arama sorgusu oluşturdum ve sorgunun kendisinde disk belleği ve sıralama işlevleri var; Sayfalama seçeneklerine bağlı olarak belirli sayıda kayıt döndürüldüğünde, belirli sayıda grup döndürmesi gerekir (böylece kayıt sayısı değişir).Temp tabloları olmadan bir SQL sorgusunda gruplar için sıra numarası nasıl eklenir

Şu anda bunu Temp Tabloları kullanarak yapıyorum (ilk temp tablosu, aramanın parçası olarak seçilecek Grupların bir listesini oluşturur ve sonra bunları numaralandırır ... ve ikinci sorgu buna katılır tabloyu gerçek aramaya ... böylece, arama sorgusunu iki kez çalıştırır.

Aradığım şey, SQL 2008'deki bazı yeni işlevlerin (temp tablolarının kullanılmasını gerektirmeyen) bazılarını kullanarak bunu yapmak için daha etkili bir yoldur.

Böyle bir formatta veri alabilir, ben ayarlanmalıdır ki ...

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

geçici tabloları kullanarak olmadan SQL 2008'de Tek bir sorgu ile bunu gerçekleştirmek için nasıl bir fikir ?

;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

Veriler hangi sütunlardan hesaplanır ve hangi değerlerin hesaplanması gerekir? – RichardTheKiwi

+0

Birinci ve ikinci sütunlar ("Kayıt [Numara]" ve "Grup") verilerden. "GroupSequence" sütunu, sorgu tarafından hesaplanacaktır. pagination amaçları doğrultusunda – Jacob

cevap

10

Numune verileri

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 

: Eğer ben çizgisinde CTE sorguları içine görünüm ve row_number fonksiyonunu ... birşeyler söyleyebilirim sahip tablolar hakkında daha fazla ayrıntı olmadan

+0

Güzel, hem row_number hem de dense_rank'in nasıl çalıştığını gösterir. –

+0

Güzel! DENSE_RANK() tam aradığım şey ve kullandığım geçici tablolardan çok daha verimli görünüyor. Doktor benim için sipariş Sadece ne – Jacob

+0

- DENSE_RANK() – rageit

1

Sorgu

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

Çıkış

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

, ben @ veya # tmp_tables ya göre çok daha hızlı çalıştırmak için görünmüyor gösterimde "olarak ile" bu yeni kullanmaya benim arama sorguları çoğunu modifiye ettik. – Jacob

+0

Dikkatli olun, çünkü bu her zaman doğru olmaz. 'With' sorgu notasyonu, bu kullanımında, bazen, bir geçici tablo veya tablo değişkeni iyi seçenekler olacak ... (birkaç kez kullanılabilir) adlandırılmış bir alt sorgu gibidir. – chezy525

İlgili konular