如何根据最新的"日期和时间"或"日期时间"列查询SQL中的最新记录



情况:序列号有重复的行,我需要选择最新的记录并获得状态值(通过或未通过都无关紧要(。

SerialNumber必须根据以前的StationNumber进行检查。示例:我想得到Station 2中最新记录SerialNumber 197601234512345的Status值,所以下面命令行中的值StationNumber=@Station实际上是"站1";

场景:序列号在1号站中可以通过也可以失败,然后序列号exp:197601234512345被提前到2号站。在站点2中,需要检查序列号exp:197601234512345在上一个站点号(站点1(中的最新状态。

数据库数据库中的示例表:

时间日期时间状态站点号上午11.53通过失败1号站下午12.11失败站点2下午12.11失败站点2下午12点05分失败晚上12点10分通过车站3
ID 序列号 日期
213939 197601234512344 2021-04-282021:04-28 11:53:00车站1
213940 197601234512345 2021-04-28 上午11.54 2021 1-04-28 11:54:00
213941 197601234512345 2021-04-282021:04-28 14:30:00
213942 197601234512345 2021-04-282021:04-28 14:31:00
213943 197601234512344
213944 197601234512344 2021-04-282021:04-28 14:46:003号站
213945 197601234512344 2021-04-282021:04-28 14:47:00

您可以使用order by获取最新的行顶部,使用Limit 1只能选择第一行。

Select Status from db.station where SerialNumber = @SN and StationNumber = @Station order by CAST(Date_Time as DateTime) desc
limit 1

DB Fiddle:

模式和插入语句:

create table station (SerialNumber varchar(50),    Date varchar(50),   Time varchar(50),   Date_Time varchar(50),  Status  varchar(50),StationNumber varchar(50));
insert into station values('197601234512345'   ,'2021-04-28','11.53 AM'    ,'2021-04-28 11:53:00'  ,'PASS',    'Station 1');
insert into station values('197601234512345'   ,'2021-04-28','11.54 AM',   '2021-04-28 11:54:00'   ,'FAIL',    'Station 1');
insert into station values('197601234512345'   ,'2021-04-28','12.00 PM',   '2021-04-28 12:00:00'   ,'PASS',    'Station 1');
insert into station values('197601234512345'   ,'2021-04-28','12.05 PM',   '2021-04-28 12:05:00'   ,'FAIL',    'Station 2');
insert into station values('197601234512345'   ,'2021-04-28','12.10 PM',   '2021-04-28 12:10:00'   ,'PASS',    'Station 2');

查询:

Select Status from station where SerialNumber ='197601234512345'  and StationNumber = 'Station 1' order by CAST(Date_Time as DateTime) desc
limit 1

输出:

状态
通过

要获取所有SerialNumber的最后一行,请使用:

MySQL 8+

WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY SerialNumber ORDER BY Date_Time DESC) rn
FROM db.station )
SELECT *
FROM cte
WHERE rn = 1;

MySQL 5+

SELECT db.station.*
FROM db.station
NATURAL JOIN ( SELECT SerialNumber, MAX(Date_Time) Date_Time
FROM db.station
GROUP BY SerialNumber ) maxdates

如果您只需要特定SerialNumber值的这些数据,则根据WHERE子句添加。

如果您不是需要SerialNumber的数据,而是需要(SerialNumber, StationNumber)的数据,则相应地修改查询。

对于单个SerialNumber值-根据WHERE和ORDER BY Date_Time DESC LIMIT 1就足够了。

解决方案:我的情况有点像在这里输入链接描述中发生的情况

所以,我的新SQL命令

SELECT a.ID, a.Date_Time, a.Status FROM db.station a, (SELECT MAX(ID) as id  FROM db.station WHERE SerialNumber = @SN Group by StationNumber = @Station) b WHERE a.ID = b.id

我测试在站点3中插入序列号197601234512345最后,它从上一站(2号站(获得最新一行

时间日期时间状态站点号下午12.11通过
ID序列号日期
2139421976012345123452021-04-282021:04-28 14:31:00车站2

最新更新