如何排序并找出各p_areaname与p_direction对应的最新记录
解决方案
要找出每个p_areaname和p_direction组合对应的最新记录,这里以p_date+p_time的时间戳作为判断“最新”的依据,提供两种常用实现方法:
方法一:使用窗口函数ROW_NUMBER()
这是最简洁直观的方式,通过窗口函数给每个分组内的记录按时间倒序编号,取编号为1的记录即可:
SELECT t.* FROM ( SELECT *, -- 按p_areaname、p_direction分组,每组内按时间倒序排号 ROW_NUMBER() OVER (PARTITION BY p_areaname, p_direction ORDER BY p_date DESC, p_time DESC) AS rn FROM test ) t WHERE t.rn = 1;
方法二:使用关联子查询
先通过子查询计算每个分组的最新时间,再关联原表匹配对应记录:
SELECT t1.* FROM test t1 INNER JOIN ( -- 计算每个分组的最新时间(日期+时间合并为 datetime) SELECT p_areaname, p_direction, MAX(p_date + CAST(p_time AS DATETIME)) AS latest_datetime FROM test GROUP BY p_areaname, p_direction ) t2 ON t1.p_areaname = t2.p_areaname AND t1.p_direction = t2.p_direction AND (t1.p_date + CAST(t1.p_time AS DATETIME)) = t2.latest_datetime;
针对你的测试数据,两种方法都会返回以下结果:
it building+1对应的最新记录:('adam', '05/10/2022', '11:00','it building', 1)global+0对应的最新记录:('adam', '05/10/2022', '11:15','global', 0)
内容的提问来源于stack exchange,提问作者prince
相关产品推荐
相关产品推荐

