MySQL查询指定日期未登记最后departure的RFID用户方法求助
解决指定日期内未登记最后离开记录的用户查询问题
这是考勤类数据里很常见的查询需求,我给你两种实用的SQL实现方案,适配大多数主流数据库(MySQL、PostgreSQL、SQL Server等):
方法一:子查询关联法
先通过子查询找出每个RFID在目标日期的最后一条记录(对应最大ID),再关联原表筛选出最后记录类型为arrival的用户:
SELECT t.RFID, t.Date, t.Time, t.`Booking type` FROM your_table t INNER JOIN ( -- 分组获取每个RFID在指定日期的最大ID(即最后一条记录) SELECT RFID, MAX(ID) AS max_id FROM your_table WHERE Date = '20.05.2018' -- 替换为你要查询的目标日期 GROUP BY RFID ) last_records ON t.ID = last_records.max_id -- 筛选最后一条记录是到达的用户(也就是未登记最后离开的) WHERE t.`Booking type` = 'arrival';
方法二:窗口函数法(更简洁直观)
利用窗口函数ROW_NUMBER()对每个RFID的记录按ID降序排名,取排名第一的记录(即最后一条),再筛选类型为arrival的:
WITH ranked_records AS ( SELECT RFID, Date, Time, `Booking type`, -- 按RFID分组,每组内按ID降序排序,第一条就是该用户的最后记录 ROW_NUMBER() OVER (PARTITION BY RFID ORDER BY ID DESC) AS rn FROM your_table WHERE Date = '20.05.2018' -- 替换为目标日期 ) SELECT RFID, Date, Time, `Booking type` FROM ranked_records WHERE rn = 1 AND `Booking type` = 'arrival';
注意事项
- 如果你的
Date字段是日期类型而非字符串,需要调整日期匹配写法,比如MySQL中可以用WHERE DATE(Date) = '2018-05-20',确保格式和数据库存储一致。 Booking type字段包含空格,SQL中需要用反引号(MySQL)或双引号(PostgreSQL/SQL Server)包裹,避免语法错误。
用你的示例数据测试的话,两种方法都会返回RFID为12345的那条最后到达记录,完全符合你的需求。
内容的提问来源于stack exchange,提问作者flapane




