基于mysql查询中最近日期的每组最大N
我需要某种帮助来解决一个问题,下面是一个带有扫描数据的表,我希望我的sql查询只显示具有给定项目最新创建的基于mysql查询中最近日期的每组最大N,mysql,sql,subquery,greatest-n-per-group,Mysql,Sql,Subquery,Greatest N Per Group,我需要某种帮助来解决一个问题,下面是一个带有扫描数据的表,我希望我的sql查询只显示具有给定项目最新创建的report\u记录的记录。一个项目可以有多个scan\u id 下表中的示例8888\u super\u start在创建最新报告的时间内只应显示一次,并且只应显示扫描的最新文件数 +--------------------+------------------+---------------+---------------------+---------------------+ | s
report\u
记录的记录。一个项目可以有多个scan\u id
下表中的示例8888\u super\u start在创建最新报告的时间内只应显示一次,并且只应显示扫描的最新文件数
+--------------------+------------------+---------------+---------------------+---------------------+
| scan_id | project_name | files_scanned | scan_submitted | report_created |
+--------------------+------------------+---------------+---------------------+---------------------+
| ba2468dd-2e38-478a | 8888_super_start | 123 | 2018-01-23 12:58:43 | 2018-01-23 13:48:46 |
| 5d3cb423-4cbb-4196 | 9111_kick_start | 1040 | 2018-01-23 14:57:15 | 2018-01-23 15:58:33 |
| 75ff4cfd-172a-4f2d | 8888_super_start | 180 | 2018-05-25 14:37:33 | 2018-05-25 20:17:19 |
+--------------------+------------------+---------------+---------------------+---------------------+
我尝试了上面提到的方法,但没有提供适当的结果。请提供一些建议
尝试
select sd.scan_id,sd.project_name,sd.files_scanned from blackbox.tb_cx_scan_details sd
left outer join blackbox.tb_cx_scan_details t2
on sd.scan_id = t2.scan_id
and (sd.report_created < t2.report_created
or (sd.report_created = t2.report_created ))
where t2.scan_id is NULL
选择sd.scan\u id、sd.project\u name、sd.files\u从blackbox.tb\u cx\u scan\u details sd扫描
左外连接blackbox.tb\u cx\u扫描\u详细信息t2
在sd.scan\u id=t2.scan\u id上
和(创建的sd.report\u<创建的t2.report\u
或者(sd.report\u created=t2.report\u created))
其中t2.scan_id为空
在MySQL 5.x中,您可以使用子查询:
select * from tb_cx_scan_details
where (project_name, report_created) in (
select project_name, max(report_created)
from tb_cx_scan_details
group by project_name
)
在MySQL 8.x中,您可以使用窗口函数:
select *,
row_number() over (partition by project_name
order by report_created desc) as my_rank
from tb_cx_scan_details
where my_rank = 1
一种方法是首先按
project\u name
分组,并获取为每个组创建的最新report\u
,然后您可以在适当的列上加入此新表,以获取每个项目的其余信息
SELECT
sd.scan_id,
sd.project_name,
sd.files_scanned
FROM
blackbox.tb_cx_scan_details AS sd
INNER JOIN
( SELECT
project_name, MAX(report_created) AS MaxReportCreated
FROM
blackbox.tb_cx_scan_details
GROUP BY
project_name ) AS latest ON latest.project_name = sd.project_name
AND latest.MaxReportCreated = sd.report_created
你也可以发布你的尝试吗?哪个版本的MySQL?8.x或5.x?5.7.21-log是版本为什么有“或”行?