Niedługo prawdopodobnie będę musiał wymyślić zapytanie SQL, które pobierze następujące dane:
Mamy tabelę z polami Id
, Data
i Kwota
i tabela ma tysiące pozycji. Czy da się w prosty sposób w MSSQL zrobić select, który będzie odpowiedzią na następujące zadanie?
Posortuj tabelę według daty i pobierz tyle pierwszych pozycji, żeby suma kwoty była nie mniejsza od pewnej podanej X.
Jeżeli nie da się poprzez select, to może poprzez wprowadzenie do drugiej tabeli. Np. element "top" pobiera określoną liczbę pierwszych pozycji, a mi chodzi o pobranie tylu pozycji, aby spełnić określony warunek, może to być 1% wszystkich pozycji.
Mam pomysł, żeby zrobić kursor w pętli, który wypełnia drugą tabelę pamięciową (nazwa zaczyna się od #
) z tymi samymi polami, gdzie pętla kończy się po osiągnięciu określonej kwoty lub po przejściu całej tabeli, potem select z tabeli #
. Jednak czy da się to samo bardziej wydajnie, np. jednym zapytaniem select
?
Drugi mój pomysł to wielokrotne odpalanie select top X
, gdzie co uruchomienie, to X jest zwiększany o 1 i sumowana jest kwota, ale to też chyba mało wydajne i niezbyt dobre. Ewentualnie coś w rodzaju select top 5 * from Dane where Id not in (select top 4 X.Id from Dane X order by X.Data) order by Data
, ale to też będzie wielokrotne robienie tego samego i obawiam się, że to takie se.