情况:序列号有重复的行,我需要选择最新的记录并获得状态值(通过或未通过都无关紧要(。
SerialNumber必须根据以前的StationNumber进行检查。示例:我想得到Station 2中最新记录SerialNumber 197601234512345的Status值,所以下面命令行中的值StationNumber=@Station实际上是"站1";
场景:序列号在1号站中可以通过也可以失败,然后序列号exp:197601234512345被提前到2号站。在站点2中,需要检查序列号exp:197601234512345在上一个站点号(站点1(中的最新状态。
数据库数据库中的示例表:
ID | 序列号 | 日期 | 时间日期时间状态站点号||
---|---|---|---|---|
213939 | 197601234512344 | 2021-04-28 | 上午11.532021:04-28 11:53:00 | 通过车站1 |
213940 | 197601234512345 | 2021-04-28 | 上午11.54 | 2021 1-04-28 11:54:00 | 失败1号站
213941 | 197601234512345 | 2021-04-28 | 下午12.112021:04-28 14:30:00 | 失败站点2|
213942 | 197601234512345 | 2021-04-28 | 下午12.112021:04-28 14:31:00 | 失败站点2|
213943 | 197601234512344 | |||
213944 | 197601234512344 | 2021-04-28 | 下午12点05分2021:04-28 14:46:00 | 失败3号站 |
213945 | 197601234512344 | 2021-04-28 | 晚上12点10分2021:04-28 14:47:00 | 通过车站3
您可以使用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号站(获得最新一行
ID | 序列号 | 日期 | 时间日期时间状态站点号||
---|---|---|---|---|
213942 | 197601234512345 | 2021-04-28 | 下午12.112021:04-28 14:31:00 | 通过车站2 |