declare @t table
(
id int,
SomeNumt int
)
insert into @t
select 1,10
union
select 2,12
union
select 3,3
union
select 4,15
union
select 5,23
select * from @t
powyższy wybór zwraca mi następujące.
id SomeNumt
1 10
2 12
3 3
4 15
5 23
Jak uzyskać następujące informacje:
id srome CumSrome
1 10 10
2 12 22
3 3 25
4 15 40
5 23 63
Odpowiedzi:
Przykład Fiddle SQL
Wynik
Edycja: jest to uogólnione rozwiązanie, które będzie działać na większości platform db. Jeśli dostępne jest lepsze rozwiązanie dla Twojej platformy (np. Gareth), skorzystaj z niego!
źródło
Najnowsza wersja SQL Server (2012) pozwala na:
lub
To jest jeszcze szybsze. Wersja podzielona na partycje kończy się w 34 sekundach dla mnie w ponad 5 milionach wierszy.
Dzięki Peso, który skomentował wątek SQL Team, o którym mowa w innej odpowiedzi.
źródło
ROWS UNBOUNDED PRECEDING
zamiastROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
.SUM(COUNT(*)) OVER (ORDER BY RowId ROWS UNBOUNDED PRECEDING) AS CumulativeSum
. Nie od razu było dla mnie oczywiste, czy to zadziała, ale zadziałało :-)Dla SQL Server 2012 i później może to być łatwe:
ponieważ
ORDER BY
klauzulaSUM
domyślnie oznaczaRANGE UNBOUNDED PRECEDING AND CURRENT ROW
ramę okna („Uwagi ogólne” na https://msdn.microsoft.com/en-us/library/ms189461.aspx )źródło
Wersja CTE, dla zabawy:
Zwroty:
źródło
Najpierw utwórz tabelę z obojętnymi danymi ->
tutaj dołączam do tego samego stołu (SELF Joining)
WYNIK:
zaczynamy teraz sumując Somevalue t2 i otrzymamy ans
Pożądany rezultat
Wyczyść dummitable
źródło
rank()
i kolejne zamówienie według klauzuli, aby go rozwiązać.Spóźniona odpowiedź, ale pokazująca jeszcze jedną możliwość ...
Generowanie sumy skumulowanej można bardziej zoptymalizować za pomocą
CROSS APPLY
logiki.Działa lepiej niż
INNER JOIN
iOVER Clause
podczas analizy rzeczywistego planu zapytań ...źródło
set io statistics on
i porównaj procesor i rzeczywiste czasy.Select *, (Select SUM(SOMENUMT) From @t S Where S.id <= M.id) From @t M
źródło
correlated subquery
dla każdego wiersza zestawu wyników, skanując coraz więcej wierszy. Nie utrzymuje bieżącej sumy i skanuje dane tak, jak potrafią to funkcje okna.W tym znakomitym poście dostępna jest znacznie szybsza implementacja CTE: http://weblogs.sqlteam.com/mladenp/archive/2009/07/28/SQL-Server-2005-Fast-Running-Totals.aspx
Problem w tym wątku można wyrazić w następujący sposób:
źródło
Możesz użyć tego prostego zapytania do obliczeń progresywnych:
źródło
Po utworzeniu tabeli -
źródło
Powyżej (przed SQL12) widzimy takie przykłady: -
Bardziej wydajny...
źródło
Spróbuj tego
źródło
Spróbuj tego:
źródło
Rozwiązanie SQL, które łączy „WIERSZE MIĘDZY BEZPIECZNYM WSTĘPNYM A BIEŻĄCYM WIERSZEM” i „SUM” zrobiło dokładnie to, co chciałem osiągnąć. Dziękuję bardzo!
Jeśli to może komukolwiek pomóc, oto moja sprawa. Chciałem kumulować +1 w kolumnie, ilekroć twórca zostanie znaleziony jako „Some Maker” (przykład). Jeśli nie, nie przyrost, ale pokaż poprzedni wynik przyrostu.
Więc ten fragment SQL:
Pozwolił mi zdobyć coś takiego:
Objaśnienie powyższego: Zaczyna się liczenie „jakiegoś twórcy” od 0, Znaleziono jakiegoś twórcę i dajemy +1. Dla użytkownika 1, MakerC jest znaleziony, więc nie robimy +1, ale zamiast tego pionowa liczba niektórych Maker zostaje zablokowana do 2, aż do następnego rzędu. Partycjonowanie odbywa się według użytkownika, więc kiedy zmieniamy użytkownika, skumulowana liczba wraca do zera.
Jestem w pracy, nie chcę zasługiwać na tę odpowiedź, wystarczy podziękować i pokazać mój przykład na wypadek, gdyby ktoś znalazł się w tej samej sytuacji. Próbowałem połączyć SUMĘ i PARTYCJĘ, ale niesamowita składnia „ROWS MIĘDZY UNBOUNDED PRECEDING A CURRENT ROW” zakończyła zadanie.
Dzięki! Groaker
źródło
Bez użycia żadnego rodzaju łącznego wynagrodzenia DOŁĄCZ za pobranie osoby za pomocą następującego zapytania:
źródło
Na przykład: JEŻELI masz tabelę z dwiema kolumnami, jedna to ID, a druga to liczba i chce znaleźć łączną sumę.
źródło