2016-03-28 12 views
1

Yani bugün itibariyle aşağıdaki kodu var kod:IN komutundaki tüm kategoriler için en iyi 200 sonuç üretmek için mantığı bulmaya çalışıyorum. (T-SQL)

select top 200 employees,phone_no,address,job_code 
from from employee 
where code IN ('BA', 'QA', 'BI') 

yüzden üretmek için arıyorum sonuç BA için Top 200 sonuç ve daha sonra QA ve Top 200 Sonuçlar Top BI için 200 sonuç. Bu yüzden, doldurması gereken toplam kayıt 600 olurdu. Geçerli kod yalnızca 200 doldurdu. Sendika komutları yapabilirim ama uzun. Bu durumda senaryoda etkili çözüm aramak.

SELECT employees, 
    phone_no, 
    address, 
    job_code, 
FROM 
    (
    select employees, 
     phone_no, 
     address, 
     job_code, 
     ROW_NUMBER() OVER (PARTITION BY CODE) as code_rownumber 
    from from employee 
    where code IN ('BA', 'QA', 'BI') 
    )subquery 
WHERE subquery.code_rownumber <=200 

bir var: Ben Union, muhtemelen de code tarafından bölümlenmiş bir satır numarası almak ve daha sonra bir dış sorguda o kısıtlamak için Pencere Fonksiyonları kullanabilirsiniz bu çözmek için uygun bir yol olduğunu düşünüyorum iken

+0

"TOP 200", "ORDER BY" deyimine sahip olmayan biraz belirsizdir. Önemi var? – HABO

cevap

4

Her bir kayıt için SELECT TOP 200... UNION SELECT TOP 200... UNION SELECT TOP 200...'dan daha uzun sürecek olan iyi bir şans, her kayıt için yapılmalıdır ve bundan sonra sadece 200'den daha azıyla sınırlandırılmalıdır.

Ayrıca, en üstteki 200 sıralama düzeninizi belirtmezsiniz. Yukarıdaki pencere işlevinde, sıraladığınız, bunu böyle yapacağını nasıl belirtmek istiyorsanız:

ROW_NUMBER() OVER (PARTITION BY CODE ORDER BY job_code DESC) as code_rownumber 

nereye sıralama her code bölüm içinde her kayıt numaralandırılması için azalan düzende job_code tarafından.

+1

BU SÜPER MÜKEMMEL. Yeni bir şey öğrendim. Bu tam olarak ne yapmak istediğimi yapıyor. Teşekkürler! Süper 7 yıldız cevap! Harikasın! :) –

1

Bunu deneyin, Sorgunuzu 3 alt sorguya bölün ve sonuçları birleştirin. Örneğin i üst 2 ProductID1 seçin 'A' ve sorgu olurdu 'B' yılında kategorik için

Top 2 kayıtları seçmek için varsa, Revenue1 ProductTotals1 nereye ('A') birliği İÇİNDE Kategori top 2 ProductID1, Revenue1 ÜrünTotals1 'den Kategori IN (' B ')

Bu yardımcı olur!

+0

Soru ifadesi "Sendika komutlarını yapabilirim ancak uzunluğunu yapabilirim." – HABO

+0

En düşük performans maliyetine sahip bir sorgu kullanın. Sorgunun uzunluğu/karmaşıklığı önemli değil. Ve gönderiye cevabınız için SİPARİŞ BY, büyükse uzun sürebilir sonuçlar kümesini sıralamak gerekiyor. –

+0

"Cevabınız", OP'in daha zarif bir şey için _their_ tercihine dayanarak daha önce düşündüğü ve kaçınmayı umduğu bir çözüm sağlar, dolayısıyla en iyi yorumdur. “ORDER BY” ile ilgili yorumum, sonuçların doğruluğunu etkileyip etkilemeyeceğini belirlemek için OP'ye yönlendirildi. Doğru sonuçların elde edilmesi gerekiyorsa, OP gerekli ek kaynakları kabul etmek zorunda kalabilir. Uzunluk, karmaşıklık, taşınabilirlik, süreklilik, performans (CPU, bellek, I/O, ...), ... OP'in göz önünde bulundurması gereken geçerli metriklerdir. – HABO

İlgili konular