我有一个数据库,其中每个记录都有一个grade
并与某个group
关联。
我需要在每个grades
中选择最佳的group
,而不是通常的前5名,而是在每个group
中选择一个不同的数字。
在下面的示例中,有10 records
和two groups
-A
和B
。
我想要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。
我会感谢提出此查询的任何想法。
致谢
答案 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)
您可以
例如:
db.collection.aggregate([
{
$match: {
"parentId": {
$eq: 0
}
}
},
{
$graphLookup: {
from: "collection",
startWith: "$cid",
connectFromField: "cid",
connectToField: "parentId",
as: "children"
}
}
])