2013-06-14 13 views
5

Więc jestem trochę zakłopotany tutaj, mam setup stół jak tenLimit SQL przez sumę wartości rzędu za

+-----------+------+ 
| Timestamp | Size | 
+-----------+------+ 
| 1-1-13 + 10.3 + 
+-----------+------+ 
| 1-3-13 + 6.7 + 
+-----------+------+ 
| 1-5-13 + 3.0 + 
+-----------+------+ 
| 1-9-13 + 11.4 + 
+-----------+------+ 

I zastanawiam się, czy jest jakiś sposób, aby uruchomić kwerendę takiego

SELECT * FROM table ORDER BY timestamp ASC LIMIT BY (SUM(size) <= 20.0);

ten powinien chwycić pierwsze trzy wiersze, ponieważ suma wielkości w pierwszych 3 rzędach wynosi 20. jednak nie zawsze może być 3 rzędy, że równy 20. Czasami pierwszy rząd może ma wartość 20, i w takim przypadku powinna przechwycić tylko pierwszą.

Jestem już świadomy, że to jest możliwe, aby szybko obliczyć sumę w PHP po uruchomieniu zapytania, ale staram się to osiągnąć tylko z MySQL.

+0

Więc chcesz uruchomioną sumie? –

+0

W języku ANSI SQL wybieramy wiersze pewnej tabeli (relacji) w oparciu o kryteria, które są dopasowane dla KAŻDEGO POJEDYNCZEGO WIERSZA wyjścia. W twoim przykładzie kryteria zmieniają się przy każdym nowym wierszu. Nie jestem pewien, ale myślę, że będzie to wymagać funkcji PL/SQL. Zwróć uwagę, jak działa ORDER - w zależności od użycia podkwerendy, otrzymasz różne wyniki, w zależności od tego, czy chcesz sortować dane wyjściowe, czy też dane wejściowe, które mają być dopasowane pod twoim warunkiem, a ORDER nie powinien być używany w ten sposób. LIMIT (lub OFFSET) prawdopodobnie ma być użyty do prostego ograniczenia liczby wierszy na wyjściu, a nie przez wyrażenie. –

Odpowiedz

3

Chcesz dodać w sumie działa, i że ograniczenie w oparciu o następujące powinny działać:

SET @runtot:=0; 
SELECT 
    q1.t, 
    q1.s, 
    (@runtot := @runtot + q1.s) AS rt 
FROM 
    (SELECT Date AS t, 
    SIZE AS s 
    FROM Table1 
    ORDER BY Date 
    ) AS q1 
WHERE @runtot + q1.s <= 20 

Edit: Demo tutaj - SQL Fiddle

+0

Po badaniach okazuje się, że masz rację. Obliczanie bieżącej sumy jest lepsze niż łączenie. Dziękuję za odpowiedź! – garetmckinley

4
SELECT * FROM ints ORDER BY i; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT x.* ,SUM(y.i) FROM ints x JOIN ints y ON y.i <= x.i GROUP BY x.i; 
+---+----------+ 
| i | SUM(y.i) | 
+---+----------+ 
| 0 |  0 | 
| 1 |  1 | 
| 2 |  3 | 
| 3 |  6 | 
| 4 |  10 | 
| 5 |  15 | 
| 6 |  21 | 
| 7 |  28 | 
| 8 |  36 | 
| 9 |  45 | 
+---+----------+ 

SELECT x.* ,SUM(y.i) FROM ints x JOIN ints y ON y.i <= x.i GROUP BY x.i HAVING SUM(y.i) <= 20; 
+---+----------+ 
| i | SUM(y.i) | 
+---+----------+ 
| 0 |  0 | 
| 1 |  1 | 
| 2 |  3 | 
| 3 |  6 | 
| 4 |  10 | 
| 5 |  15 | 
+---+----------+ 
+0

Próbowałem rozwiązać problem przez podzapytanie, dołączenie jest tak lepsze i czytelne. +1 – Marcassin

+0

Wow, świetna odpowiedź. Czy występują jakieś problemy z wydajnością? – garetmckinley

+0

suma wyników według zmiennej zapisuje obciążenie dla siebie JOIN. –

Powiązane problemy