mysql - mysql:尝试按部分值对记录进行分组
问题描述
我正在尝试执行 sql 选择查询来获取某些记录并按某个字段值对它们进行分组。
我有一个名为的表courses
,如下所示:
+----+----------+
| id | shortname|
+----+----------+
3, 20115-2019a
4, 10112-2018a
5, 20115-2019b
6, 10112-2020a
7, 43112-2017a
“shortname”字段的最后一部分代表一个学期。(“2019a”、“2018a”等)数字(“20115”、“10112”等)是课程名称。
我需要一个 sql 查询来获取每门课程最新学期的记录。
在上面的示例中,我希望结果为:
- 5、20115-2019b(因为2019b是20115的最后一个学期)
- 6、10112-2020a(因为2020a是10112的最后一个学期)
- 7、43112-2017a(因为2017a是43112的最新学期)
这是我到目前为止所尝试的:
SELECT id, MAX(shortname)
FROM courses
不行,只给我第一条记录。
我设法将课程名称与学期分开,并尝试按课程名称进行分组:
SELECT id, shortname,
SUBSTRING_INDEX(shortname, "-", 1) AS coursename,
SUBSTRING(shortname, POSITION("-" IN shortname)+1, 7) AS semester
FROM courses
GROUP BY coursename
但这似乎给了我第一个而不是最新的课程
解决方案
您可以使用not exists
:
select c.* from courses c
where not exists (
select 1 from courses
where
left(shortname, locate('-', shortname) - 1) =
left(c.shortname, locate('-', c.shortname) - 1)
and
substr(shortname, locate('-', shortname) + 1) >
substr(c.shortname, locate('-', c.shortname) + 1)
)
请参阅演示。
结果:
| id | shortname |
| --- | ----------- |
| 5 | 20115-2019b |
| 6 | 10112-2020a |
| 7 | 43112-2017a |
推荐阅读
- javascript - 如何通过 js 在 Azure 媒体播放器 (AMP) 上激活 vtt 文件?
- yocto - 在 wic 图像中包含 tar.bz 图像
- sql - 为什么这些子查询单独工作,而在使用 UNION 时却不行?
- python - Pyodbc 在非 conda python 中工作,但无法在 conda 中加载驱动程序
- perl - 引用在另一个 Perl 模块文件中创建散列的 Perl 模块,该文件将散列设置为等于该散列
- c# - C# AWS S3 - 列出在特定时间之前或之后创建的对象
- azure - Azure 应用注册时的 API 权限问题
- sql - 检查记录是否有 ascii char
- r - ggplot 按因子和渐变着色
- python - 如何在 CentOs 中修复“Python 中的 ssl 模块不可用”