Załóżmy, że masz tabelę "Samochody" z setkami tysięcy wierszy, i chciał zrobić GROUP BY:T-SQL GROUP BY z hrabią, a następnie dołączyć MAX z COUNT
SELECT CarID
, CarName
, COUNT(*) AS Total
FROM dbo.tbl_Cars
GROUP BY CarID
, CarName
Grupowanie pozostawia wynik podobny do:
CarID CarName Total
1872 Olds 202,121
547841 BMW 175,298
9877 Ford 10,241
Wszystko dobrze i dobrze. Moje pytanie jest jednak to, co jest najlepszym sposobem, aby uzyskać Razem i MAX sumy na jednym stole, pod względem wydajności i czystych kodowania, więc masz wynik takiego:
CarID CarName Total Max Total
1872 Olds 202,121 202,121
547841 BMW 175,298 202,121
9877 Ford 10,241 202,121
Jednym podejściem byłoby umieścić wynik GROUP w tabeli temp, , a następnie uzyskać MAX z tabeli temp do zmiennej lokalnej. Ale zastanawiam się, jaki byłby najlepszy sposób na zrobienie tego.
UPDATE
Common Expression tabeli wydaje się najbardziej elegancki pisać, jeszcze podobny do @EBarr, mój ograniczone badania wskazują na znacznie mniejszą wydajność. Więc nie będę z CTE.
Ponieważ link @EBarr dla opcji COMPUTE
oznacza, że funkcja jest przestarzała, to nie wydaje się być najlepszą trasą.
Opcja zmiennej lokalnej dla wartości MAX i użycia tabeli temp będzie prawdopodobnie trasą, którą pokonuję, ponieważ nie jestem świadoma problemów z nią związanych.
Nieco więcej szczegółów na temat mojego przypadku użycia: może to prawdopodobnie być seria innych pytań SO z serii . Ale wystarczy powiedzieć, że ładuję duży podzbiór danych do tabeli temp (tak, że podzbiór tbl_Cars jest przechodzący do #tbl_Cars, a nawet #tbl_Cars mogą być dalej filtrowane i mają wykonane agregacje na nim), ponieważ Muszę wykonać wiele filtrowania i kwerendy agregacji na nim w ramach jednego zapisanego procesu, który zwraca wiele zestawów wyników.
UPDATE 2
@ użycie EBarr za okienkowanej funkcją jest miła i krótka. Uwaga dla siebie: jeśli używasz RIGHT JOIN
do zewnętrznej tabeli odniesienia, funkcja COUNT()
powinna wybrać kolumnę z tbl_Cars, a nie '*'
.
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
Pod względem szybkości, wydaje się w porządku, ale w jakim punkcie masz być zaniepokojeni liczbę odczytów?
Nie można używać 'MAX' w widoku indeksowanego (byłem prosić o to przez 5 lat - http://connect.microsoft.com/SQLServer/feedback/details/267516/expand-aggregate-support-in-indexed-views-min-max). Również 'theFieldBeingSearchedForMax' nie znajduje się w tabeli, jest częścią wyjścia (jest to najwyższa liczba). –
Wystarczy ponownie przeczytać pytanie. Źle to przeczytałem. Aktualizacja SQL. – EBarr
- Niestety nie udało mi się dodać GROUP BY w pierwszym zapytaniu; mój błąd. – mg1075