MySQL选择每个分组的前n行

6
我已经阅读了这篇文章:http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/,并搜索了其他问题。
我有一个类似于以下表格的表:
| 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

我正在尝试按user.id分组获取table.id的计数,如果user.id的计数超过7,则只显示结果为7(即将计数结果限制为7)。

在此示例中,结果应为:

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

我已经尝试过:

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
3个回答

8
你可以简化查询,使用LEAST函数(查看官方文档)
SELECT USERid, LEAST(7, COUNT(*))
FROM table
GROUP BY USERid

从您评论中的问题开始

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

SqlFiddle


非常好用!而且非常简单。我该如何获得那个COUNT列的SUM呢?我尝试了SELECT userid,SUM(SELECT LEAST(7,COUNT(*))FROM table GROUP BY USERid)FROM table,但是这导致了错误。 - Ken
是的,那个计数列的总和。在原始示例中,计数列的总和与最大结果限制为7将会是29。 - Ken

1
SELECT userid,
CASE
  WHEN COUNT(*) > 7 THEN 7
  ELSE COUNT(*)
END AS Qty
FROM tbl
GROUP BY userid

0
SELECT USERid, case when COUNT(table.id) > 7 
                    then 7 
                    else COUNT(table.id) 
               end
FROM table
GROUP BY USERid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接