为每个组

时间:2015-08-19 15:52:35

标签: mysql

我在表中有这个结果

+------------------------------------------------+
|adm_no   |   code     | value   |   group_id    |
+------------------------------------------------+
|1200     |  101       | 50      |    1          |
+------------------------------------------------+
|1200     |   102      | 60      |    1          |
+------------------------------------------------+
|1200     |  121       | 62      |    1          |
+------------------------------------------------+
|1200     |  233       |  50     |   2           |
+------------------------------------------------+
|1200     |  231       |  98     |   2           |
+------------------------------------------------+
|1200     |  232       | 85      |    2          |
+------------------------------------------------+
|1200     | 511        |   75    |     3         |
+------------------------------------------------+
|1200     |  585       |   38    |     3         |
+------------------------------------------------+
|1200     |  711       |    45   |      4        |
+------------------------------------------------+
|1200     |   785      |     45  |      4        |
+------------------------------------------------+ 

现在我可以为每个组选择一组有限的行,只要限制的数量相同但我不知道如何执行此操作。

所以我想做的是:

1.选择所有具有group_id = 1

的行

2.仅选择具有group_id = 2

的前两行

3.仅选择具有group_id = 3和group_id = 4

的第一行

如果可以在单个查询中完成任何指针

1 个答案:

答案 0 :(得分:1)

您可以使用变量:

SELECT adm_no, code, value, group_id
FROM (
  SELECT adm_no, code, value, group_id,
         @rn := IF (@gr = group_id,
                    IF(@gr := group_id, @rn+1, @rn+1),
                    IF(@gr := group_id, 1, 1)) AS rn
  FROM mytable
  CROSS JOIN (SELECT @rn:=0, @gr:=0) AS vars
  ORDER BY group_id, code ) t
WHERE (group_id = 1) 
      OR (group_id = 2 AND rn <= 2) 
      OR (group_id IN (3,4) AND rn = 1) 

变量@rn@gr用于实现其他RDBMS(如SQL SERVER,PostgreSQL等)中可用的ROW_NUMBER() OVER (PARTITION BY ..)窗口函数...

因此,@rn基本上用于枚举每个group_id切片中的记录。在外部查询中使用此变量,我们可以轻松获得预期的结果集。

请注意使用嵌套条件,以便正确使用然后设置@gr变量。

Demo here