按组选择不同数量的记录

时间:2019-03-07 16:19:04

标签: mysql

我有一个数据库,其中每个记录都有一个grade并与某个group关联。
我需要在每个grades中选择最佳的group,而不是通常的前5名,而是在每个group中选择一个不同的数字。

在下面的示例中,有10 recordstwo groups-AB

我想要group A中最高的2个成绩和group B中最高的3个成绩:

ID  Group   Grade
1     A      4
2     B      2
3     B      4
4     A      7
5     A      8
6     A      5
7     B     10
8     B      3
9     B      9
10    A      7

查询应选择A组的记录4和5,以及B组的记录3、7和9。

我会感谢提出此查询的任何想法。

致谢

2 个答案:

答案 0 :(得分:0)

只有2个组,但前N个不同?

然后,我猜一个有2个限制的并集可以在MySql 5. *版本中完成这项工作。

SELECT ID, `Group`, Grade
FROM 
(
   SELECT * FROM YourTable 
   WHERE `Group` = 'A' 
   ORDER BY Grade DESC, ID ASC
   LIMIT 2
) A
UNION ALL
SELECT ID, `Group`, Grade
FROM 
(
   SELECT * FROM YourTable 
   WHERE `Group` = 'B' 
   ORDER BY Grade DESC, ID ASC
   LIMIT 3
) B
ORDER BY `Group`, Grade DESC, ID;

结果:

ID  Group   Grade
5   A       8
4   A       7
7   B       10
9   B       9
3   B       4

在MySql 8中,您可以为此使用ROW_NUMBER或DENSE_RANK函数。

答案 1 :(得分:0)

您可以

  • 分组依据 分组列
  • 使用子查询来获取所需的最佳成绩ID

例如:

db.collection.aggregate([
  {
    $match: {
      "parentId": {
        $eq: 0
      }
    }
  },
  {
    $graphLookup: {
      from: "collection",
      startWith: "$cid",
      connectFromField: "cid",
      connectToField: "parentId",
      as: "children"
    }
  }
])