在 GROUP BY 中使用 LIMIT 以获得每个动态组的 N 个结果
Using LIMIT within GROUP BY to get N results per dynamic group
在 GROUP BY
中使用 LIMIT
以获得每个动态组的 N 个结果
大家好,第一次看类似这个问题。
但没有得到解决方案。所有这些 SQL 都是为静态列设计的。
但是我有动态列。
Table:
id Name Group Level
2 Jonathan A 5
5 David A 10
6 Alex C 10
7 Kemal A 71
8 John D 21
9 Celin F 100
12 Alexis G 15
13 Noone A 23
我想从每个组中获得前 2 个最高 Level
。
但是查询必须是动态的,因为会有更多的组,这是我卡住的地方。
我尝试过的解决方案:
- Select the top N rows from each group 没有给出正确的结果它坏了。
- Only work in static columns.
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,name VARCHAR(12) NOT NULL
,group_name CHAR(1) NOT NULL
,level INT NOT NULL
);
INSERT INTO my_table VALUES
( 2,'Jonathan','A',5),
( 5,'David','A',10),
( 6,'Alex','C',10),
( 7,'Kemal','A',71),
( 8,'John','D',21),
( 9,'Celin','F',100),
(12,'Alexis','G',15),
(13,'Noone','A',23);
SELECT id
, name
, group_name
, level
FROM
( SELECT x.*
, CASE WHEN @prev = group_name THEN @i:=@i+1 ELSE @i:=1 END i
, @prev:=group_name
FROM my_table x -- technically, ordering should really happen here, in a separate subquery
, ( SELECT @prev:=null,@i:=0 ) vars
ORDER
BY group_name
, level DESC
, id
) a
WHERE i <=2;
+----+--------+------------+-------+
| id | name | group_name | level |
+----+--------+------------+-------+
| 7 | Kemal | A | 71 |
| 13 | Noone | A | 23 |
| 6 | Alex | C | 10 |
| 8 | John | D | 21 |
| 9 | Celin | F | 100 |
| 12 | Alexis | G | 15 |
+----+--------+------------+-------+
你也可以做变通方法。
Select 列最多 2 行
从 TABLE 按组级别降序排列
问候,
奥马尔·阿卜杜拉
在 GROUP BY
中使用 LIMIT
以获得每个动态组的 N 个结果
大家好,第一次看类似这个问题。 但没有得到解决方案。所有这些 SQL 都是为静态列设计的。 但是我有动态列。
Table:
id Name Group Level
2 Jonathan A 5
5 David A 10
6 Alex C 10
7 Kemal A 71
8 John D 21
9 Celin F 100
12 Alexis G 15
13 Noone A 23
我想从每个组中获得前 2 个最高 Level
。
但是查询必须是动态的,因为会有更多的组,这是我卡住的地方。
我尝试过的解决方案:
- Select the top N rows from each group 没有给出正确的结果它坏了。
- Only work in static columns.
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,name VARCHAR(12) NOT NULL
,group_name CHAR(1) NOT NULL
,level INT NOT NULL
);
INSERT INTO my_table VALUES
( 2,'Jonathan','A',5),
( 5,'David','A',10),
( 6,'Alex','C',10),
( 7,'Kemal','A',71),
( 8,'John','D',21),
( 9,'Celin','F',100),
(12,'Alexis','G',15),
(13,'Noone','A',23);
SELECT id
, name
, group_name
, level
FROM
( SELECT x.*
, CASE WHEN @prev = group_name THEN @i:=@i+1 ELSE @i:=1 END i
, @prev:=group_name
FROM my_table x -- technically, ordering should really happen here, in a separate subquery
, ( SELECT @prev:=null,@i:=0 ) vars
ORDER
BY group_name
, level DESC
, id
) a
WHERE i <=2;
+----+--------+------------+-------+
| id | name | group_name | level |
+----+--------+------------+-------+
| 7 | Kemal | A | 71 |
| 13 | Noone | A | 23 |
| 6 | Alex | C | 10 |
| 8 | John | D | 21 |
| 9 | Celin | F | 100 |
| 12 | Alexis | G | 15 |
+----+--------+------------+-------+
你也可以做变通方法。
Select 列最多 2 行
从 TABLE 按组级别降序排列
问候,
奥马尔·阿卜杜拉