2013-10-03 23 views
5

Tôi đã đọc bài viết này: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ và tìm kiếm các câu hỏi khácmysql chọn n hàng đầu tiên cho mỗi nhóm

Tôi có một bảng mà là một cái gì đó như:

| 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 

Tôi đang cố gắng để có được số lượng table.id được nhóm theo user.id và nếu tổng số user.id lớn hơn 7, chỉ hiển thị kết quả là 7 (còn giới hạn kết quả đếm là 7).

Trong ví dụ này, kết quả sẽ là:

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

Tôi đã thử:

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

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 

Trả lời

6

Bạn có thể đơn giản hóa truy vấn của bạn, và sử dụng LEAST chức năng

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

từ câu hỏi trong bình luận của bạn

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

SqlFiddle

+0

Các công trình lớn! Và rất đơn giản. Làm cách nào tôi nhận được SUM của cột COUNT đó? Tôi đã thử SELECT userid, SUM (SELECT LEAST (7, COUNT (*)) TỪ bảng GROUP BY USERid) TỪ bảng, mặc dù điều này dẫn đến lỗi – Ken

+0

Có tổng của cột đếm đó. Trong ví dụ ban đầu, tổng của cột đếm với giới hạn tối đa 7 kết quả sẽ là = 29 – Ken

+0

@Phil xem chỉnh sửa sau đó –

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 
Các vấn đề liên quan