选择具有条件的最新行和恰好2行,以及具有不同条件的2行

问题描述 投票:0回答:2

我有一个名为student_grades的表

╔════╤═══════╤═══════╤═════════════════════╗
║ id │ name  │ grade │ date_added          ║
╠════╪═══════╪═══════╪═════════════════════╣
║ 1  │ bob   │ 23    │ 2019-10-01 14:25:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 2  │ james │ 45    │ 2019-10-02 17:31:27 ║
╟────┼───────┼───────┼─────────────────────╢
║ 3  │ mike  │ 42    │ 2019-10-03 18:08:13 ║
╟────┼───────┼───────┼─────────────────────╢
║ 4  │ bob   │ 68    │ 2019-10-04 02:00:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 5  │ mike  │ 83    │ 2019-10-04 09:28:43 ║
╟────┼───────┼───────┼─────────────────────╢
║ 6  │ bob   │ 93    │ 2019-10-04 11:42:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 7  │ james │ 98    │ 2019-10-05 14:51:20 ║
╟────┼───────┼───────┼─────────────────────╢
║ 8  │ steph │ 72    │ 2019-10-05 15:31:20 ║
╟────┼───────┼───────┼─────────────────────╢
║ 9  │ john  │ 78    │ 2019-10-05 16:33:20 ║
╟────┼───────┼───────┼─────────────────────╢
║ 10 │ john  │ 74    │ 2019-10-05 17:42:23 ║
╟────┼───────┼───────┼─────────────────────╢
║ 10 │ nick  │ 92    │ 2019-10-05 17:59:12 ║
╚════╧═══════╧═══════╧═════════════════════╝

我使用此语句来获取学生的最新记录。例如。 James有2条记录。一个带有id 2,另一个带有id 7。因此,我想使用id 7,因为id较大。

然后我将那些行随机化,然后返回我

╔════╤═══════╤═══════╤═════════════════════╗
║ id │ name  │ grade │ date_added          ║
╠════╪═══════╪═══════╪═════════════════════╣
║ 7  │ james │ 86    │ 2019-10-05 12:11:20 ║
╟────┼───────┼───────┼─────────────────────╢
║ 5  │ mike  │ 83    │ 2019-10-04 09:28:43 ║
╚════╧═══════╧═══════╧═════════════════════╝

声明:

SELECT s1.*
FROM student_grade s1
JOIN (SELECT name, MAX(id) AS id
      FROM student_grade
      GROUP BY name) s2 ON s2.name = s1.name AND s2.id = s1.id
ORDER BY RAND()
LIMIT 2;

[[我的问题是,我如何选择2名得分在70到80之间的学生(随机选择)和2名得分在90到99之间的学生(随机选择)的最新记录。

SELECT s1.* FROM student_grade s1 JOIN (SELECT name, MAX(id) AS id FROM student_grade WHERE (grade >= 70 and grade <= 80) or (grade >= 90 and grade <= 99) GROUP BY name) s2 ON s2.name = s1.name AND s2.id = s1.id ORDER BY RAND() LIMIT 4;
但是如果我做上述陈述,它[[可能
给我3名得分为70-80的学生和1名得分为90-99的学生。我想从70-80(随机选择)中的

精确2个学生中,从90-99(随机选择)中的精确2个学生中。我该怎么办?

mysql sql database greatest-n-per-group
2个回答
0
投票
(SELECT s1.* FROM student_grade s1 JOIN (SELECT name, MAX(id) AS id FROM student_grade WHERE grade BETWEEN 70 AND 80 GROUP BY name) s2 ON s2.name = s1.name AND s2.id = s1.id ORDER BY RAND() LIMIT 2) UNION ALL (SELECT s1.* FROM student_grade s1 JOIN (SELECT name, MAX(id) AS id FROM student_grade WHERE grade BETWEEN 90 AND 99 GROUP BY name) s2 ON s2.name = s1.name AND s2.id = s1.id ORDER BY RAND() LIMIT 2)

Demo on dbfiddle

我们可以使用UNION ALL,因为我们知道不会重复,因为成绩范围不同。

0
投票
[我的问题是,我如何选择2名得分在70到80之间的学生(随机选择)和2名得分在90到99之间的学生(随机选择)的最新记录。
在MySQL 8+中,最简单的方法使用行号:

select sg.* from (select sg.* row_number() over (partition by (case when grade between 70 and 80 then 1 when grade between 90 and 99 then 2 else 3 end) order by rand() ) as seqnum from student_grades sg where grade between 70 and 80 or grade between 90 and 99 ) sg where seqnum <= 2;

© www.soinside.com 2019 - 2024. All rights reserved.