2016-03-31 16 views
0

'daki yüzdelik aralığını hesapla Sql Server 2014 kullanıyorum, gerekirse tüm eklentileri, SSAS'ı alabilirim.Sql Server 2014

Basitlik için tamsayılarla tek bir sütun içeren bir tablom var. 10^5 - 10^6 satır içerdiğini kabul etmek güvenlidir. 512, 10, 15, 90, 95 persentillerini hesaplamak istiyorum.

Kolayca, yüzlerce (yüzdelik) ve yüzdelik (yüzdelik) msn ifadesini kullanarak kolayca yapabilirim. Maalesef, sonsuza kadar sürer. Sorun şu ki, bu çağrıların tekrar tekrar aynı şeyi yaptıklarından kesinlikle eminim.

Bir tablo üzerinde bir dizi yüzdesini daha hızlı hesaplamanın bir yolu var mı?

Bunu kolayca C# 'de yapabilirim, tüm satırları belleğe yükleyerek, onları sipariş ederek ve sadece 0.05 * array.Length öğesini, 0.1 * array.Length öğesini vb. Sorarak yapabilirim - ve açıkça çılgınca bir şekilde hızlı. Tabii ki bir tablo değişkenini veya geçici bir tabloyu kullanarak çoğaltabiliyorum, ancak bazı yolların inşa edilmediğine şaşırdım.

select nt, min(num), max(num), count(*) 
from (select t.*, ntile(20) over (order by num) as nt 
     from t 
    ) t 
group by nt 
order by nt; 

Ben de pencere fonksiyonları için sütun üzerinde bir dizin faydalanmak gerektiğini SQL Server eklemek gerekir:

+0

"percentile_cont()" işlevini ayrı sorgular olarak değil, ayrı sütunlar olarak çalıştırmayı deneyin. –

+0

Yüzdeliklerle çalışırken, terimin belirsiz olduğunu unutmayın. https://en.wikipedia.org/wiki/Percentile. Hesaplama yönteminin iş gereksinimlerinizi karşıladığından emin olun. –

+0

@GordonLinoff - evet, elbette - p10, percentile_cont() olarak p10, ... olarak yüzdelik yüzdesini seçecektik. Hala çok, çok yavaş. – Gerino

cevap

2

bir yöntemi ntile() ve agregasyonu kullanmaktır. Yani, bir endeks ekleyerek yaklaşımınızı hızlandırabilirsiniz.

+0

'Msg 1033, Düzey 15, Durum 1, Satır 5 TOP, OFFSET veya FOR XML belirtilmemişse, ORDER BY yan tümcesi görünümler, satır içi işlevler, türetilmiş tablolar, alt sorgular ve ortak tablo ifadelerinde geçersizdir. ' – Gerino

+0

, şimdi çalışır: ' 'dan ( select num, ntile (20) num (ustile.num olarak) tablodan nt ( tablosundan) nt, min (num), maks (num) sayısını seçin (0) a) nt tarafından grubu tarafından gruplandırıldı; – Gerino

+0

Sadece 18-yüzdelik_disc çağrısı ile karşılaştırdım ve aynı sonucu (max sütununda), son derece hızlı bir şekilde verir. Teşekkür ederim! – Gerino