Yüzlerce , satır binlerce ile "Arabalar" bir tablo vardı varsayalım COUNT gelen MAX yer ve GROUP BY yapmak istedim:t-sql COUNT ile GROUP BY ve sonra
SELECT CarID
, CarName
, COUNT(*) AS Total
FROM dbo.tbl_Cars
GROUP BY CarID
, CarName
gruplama benzer bir sonuçla bırakır:
CarID CarName Total
1872 Olds 202,121
547841 BMW 175,298
9877 Ford 10,241
tüm ince ve iyi. Benim sorum olsa da, performans ve temiz kodlama açısından Toplam ve bir tabloya MAX Toplam almak için en iyi yolu nedir, bu nedenle böyle bir sonucu vardır:
CarID CarName Total Max Total
1872 Olds 202,121 202,121
547841 BMW 175,298 202,121
9877 Ford 10,241 202,121
Bir yaklaşıma GRUP sonucunu geçici tabloya, 'a koymak ve MAX'ı geçici tablodan yerel bir değişkene almak olacaktır. Ama bunu yapmanın en iyi yolunun ne olacağını merak ediyorum.
GÜNCELLEME
Ortak Tablo İfade yazmak için en şık görünüyor, @EBarr henüz benzer , benim sınırlı test önemli ölçüde daha yavaş bir performans gösterir. Yani CTE ile gitmeyeceğim.
@EBarr bağlantısının COMPUTE
için bağlantı seçeneği olarak öğesinin kullanımdan kaldırıldığını bildirir, bu da en iyi yol görünmüyor.
MAX değeri ve bir geçici tablonun kullanımı için yerel bir değişken seçeneği, aşağı yukarı gideceğim yoldur, çünkü ben ile ilgili performans sorunlarının farkında değilim.
A benim kullanım durumunda ilgili daha fazla ayrıntı bit: muhtemelen diğer SO soru serisi olmuyor olabilir. Ancak, büyük bir veri kümesini geçici bir tabloya yüklediğimi söylemek yeterlidir (bu yüzden tbl_Cars'ın bir alt kümesi, #tbl_Cars içine giriyor ve hatta #tbl_Cars daha fazla filtrelenebilir ve üzerinde gerçekleştirilebilir). Ben birden çok sonuç kümesi döndüren bir tek saklı yordam geçmesine rağmen üzerlerinde çoklu filtreleme ve toplama sorguları gerçekleştirmek zorunda. pencereli bir fonksiyonun EBarr kullanması güzel ve kısa @
GÜNCELLEME 2
. Not: , bir dış başvuru tablosuna RIGHT JOIN
kullanılıyorsa, COUNT()
işlevi, '*'
değil tbl_Cars'dan bir sütun seçmelidir. Hız açısından
SELECT M.MachineID
, M.MachineType
, COUNT(C.CarID) AS Total
, MAX(COUNT(C.CarID)) OVER() as MaxTotal
FROM dbo.tbl_Cars C
RIGHT JOIN dbo.tbl_Machines M
ON C.CarID = M.CarID
GROUP BY M.MachineID
, M.MachineType
, bu iyi görünüyor, ama ne noktada okur sayısı hakkında endişeli olmak zorunda mısın?
Bir endeksli görünümünde 'MAX' kullanamaz (ı been 5 yıl için soruyorum - http://connect.microsoft.com/SQLServer/feedback/details/267516/expand-aggregate-support-in-indexed-views-min-max). Ayrıca "theFieldBeingSearchedForMax", tabloda yok, çıktının bir parçasıdır (en yüksek sayıdır). –
Sadece tekrar soruyu okuyun. Yanlış okumuşum. SQL güncelleniyor. – EBarr
- Üzgünüz, ilk sorguda GROUP BY'yi ekleyemedim; benim hatam. – mg1075