简体   繁体   English

在GROUP BY中使用LIMIT获得每个动态组N个结果

[英]Using LIMIT within GROUP BY to get N results per dynamic group

Using LIMIT within GROUP BY to get N results per dynamic group GROUP BY使用LIMIT获得每个动态组N个结果

Hello everyone, firstly I read about questions like this problem. 大家好,首先我读到有关此类问题的信息。 But didn't get the solution. 但没有得到解决方案。 All of this SQL's are designed for static columns. 所有这些SQL都是为静态列设计的。 But I have dynamic columns. 但是我有动态列。

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

I want to get the first 2 highest Level from each group. 我想从每个组中获得前2个最高Level

But query must be dynamic because there will be more Groups, which is where I am stuck. 但是查询必须是动态的,因为将会有更多的组,这就是我遇到的问题。

Solutions I tried: 我尝试的解决方案:

  1. Select the top N rows from each group Not giving true result it's broken. 从每个组中选择前N行。如果没有给出正确的结果,则该行已损坏。
  2. 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 |
+----+--------+------------+-------+

You can also do workaround. 您也可以解决方法。

Select colums upto 2 rows 选择最多2行的列

FROM TABLE ORDER BY DESCENDING GROUP LEVEL 从表顺序开始按下降的组级别

regards, 问候,

Umar Abdullah 乌马尔·阿卜杜拉(Umar Abdullah)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM