2013-10-03 26 views
5

Czytałem ten artykuł: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ i szukać innych pytańmysql wybrać pierwsze n wierszy na grupy

Mam tabeli że jest coś takiego jak:

| table.id | USER.id 
---------------------------------------------- 
| 1   | 101 
| 2   | 101 
| 3   | 101 
| 4   | 101 
| 5   | 101 
| 6   | 101 
| 7   | 101 
| 8   | 101 
| 9   | 101 
| 10   | 101 
| 11   | 102 
| 12   | 102 
| 13   | 102 
| 14   | 102 
| 15   | 103 
| 16   | 103 
| 17   | 103 
| 18   | 103 
| 19   | 103 
| 20   | 103 
| 21   | 103 
| 22   | 103 
| 23   | 103 
| 24   | 104 
| 25   | 104 
| 26   | 104 
| 27   | 104 
| 28   | 104 
| 29   | 104 
| 30   | 105 
| 31   | 105 
| 32   | 105 
| 33   | 106 
| 34   | 106 

Próbuję dostać liczba table.id pogrupowana według user.id, a jeśli liczba user.id jest większa niż 7, wyświetla wynik tylko jako 7 (ograniczający wyniki zliczania do 7).

W tym przykładzie, wynik powinien być:

| USER.id   | count of table.ID 
---------------------------------------- 
| 101    | 7 
| 102    | 4 
| 103    | 7 
| 104    | 6 
| 105    | 3 
| 106    | 2 

Próbowałem:

SELECT USERid, COUNT(table.id) 
FROM table 
WHERE table.id IN (select top 7 table.id from table) 
GROUP BY USERid 

i

SELECT USERid, COUNT(table.id) 
FROM table 
WHERE (
    SELECT COUNT(table.ID) FROM table as t 
    WHERE t.id = t.id AND t.USERid <= table.USERid 
    ) <= 7 
GROUP BY USERid 

Odpowiedz

6

Można uprościć zapytanie, a użyj funkcji LEAST

SELECT USERid, LEAST(7, COUNT(*)) 
FROM table 
GROUP BY USERid 

od kwestii w swoim komentarzu

SELECT SUM(countByUser) 
FROM 
(SELECT LEAST(7, COUNT(*)) as countByUser 
    FROM table 
    GROUP BY USERid) c 

SqlFiddle

+0

Działa świetnie! I bardzo proste. Jak uzyskać SUMA z tej kolumny COUNT? Próbowałem SELECT userid, SUMA (SELECT LEAST (7, COUNT (*)) Z tabeli GROUP BY USERID) z tabeli, ale to spowodowało błąd – Ken

+0

Tak, suma tej kolumny licznika. W oryginalnym przykładzie suma kolumny liczenia z limitem 7 wyników maksimum wyniosłaby = 29 – Ken

+0

@Phil patrz edytuj następnie –

0
SELECT USERid, case when COUNT(table.id) > 7 
        then 7 
        else COUNT(table.id) 
       end 
FROM table 
GROUP BY USERid 
0
SELECT userid, 
CASE 
    WHEN COUNT(*) > 7 THEN 7 
    ELSE COUNT(*) 
END AS Qty 
FROM tbl 
GROUP BY userid 
Powiązane problemy