You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动