我在表中有这个结果
+------------------------------------------------+
|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
的第一行如果可以在单个查询中完成任何指针
答案 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
变量。