Sql 从表中几乎相同或正确的多个数据中检索第一个数据
如何从具有多个相同数据的查询中检索数据?。像这样的。我有这样的数据表示:Sql 从表中几乎相同或正确的多个数据中检索第一个数据,sql,database,mariadb,greatest-n-per-group,Sql,Database,Mariadb,Greatest N Per Group,如何从具有多个相同数据的查询中检索数据?。像这样的。我有这样的数据表示: Id Time Status ------------------------------------- 1 2019-09-09 09:00:00 1 2 2019-09-09 09:02:36 1 3 2019-09-09 09:06:00 1 4 2019-09-09 09:10:11 1 5 2019-09-
Id Time Status
-------------------------------------
1 2019-09-09 09:00:00 1
2 2019-09-09 09:02:36 1
3 2019-09-09 09:06:00 1
4 2019-09-09 09:10:11 1
5 2019-09-09 17:00:00 2
6 2019-09-09 17:05:00 2
7 2019-09-10 09:00:00 1
8 2019-09-10 09:02:32 1
9 2019-09-10 09:02:38 1
10 2019-09-10 17:00:00 2
11 2019-09-10 17:00:30 2
现在,我想返回类似以下内容的参数,其中date=2019-09-09:
我想返回插入的第一个数据。使用行号:
如果您使用的MySQL版本早于8+,请使用:
SELECT t1.id, t1.Time, t1.Status
FROM yourTable t1
INNER JOIN
(
SELECT Status, MIN(Time) AS min_time
FROM yourTable
WHERE Time >= '2019-09-09' AND Time < '2019-09-10'
GROUP BY Status
) t2
ON t1.Status = t2.Status AND t1.Time = t2.min_time
WHERE
t1.Time >= '2019-09-09' AND t1.Time < '2019-09-10'
ORDER BY
t1.Status;
使用行号:
如果您使用的MySQL版本早于8+,请使用:
SELECT t1.id, t1.Time, t1.Status
FROM yourTable t1
INNER JOIN
(
SELECT Status, MIN(Time) AS min_time
FROM yourTable
WHERE Time >= '2019-09-09' AND Time < '2019-09-10'
GROUP BY Status
) t2
ON t1.Status = t2.Status AND t1.Time = t2.min_time
WHERE
t1.Time >= '2019-09-09' AND t1.Time < '2019-09-10'
ORDER BY
t1.Status;
下表和查询将解决您的问题:
CREATE TABLE TEST
(
ID TINYINT,
DATE SMALLDATETIME,
STATUS TINYINT,
)
INSERT INTO TEST VALUES (1, '2019-09-09 09:00:00', 1),
(2 , '2019-09-09 09:02:36' , 1),
(3 , '2019-09-09 09:06:00' , 1),
(4 ,'2019-09-09 09:10:11' , 1),
(5 ,'2019-09-09 17:00:00' , 2),
(6 , '2019-09-09 17:05:00' , 2),
(7 , '2019-09-10 09:00:00' , 1),
(8 , '2019-09-10 09:02:32' , 1),
(9 , '2019-09-10 09:02:38' , 1),
(10 , '2019-09-10 17:00:00' , 2),
(11 ,' 2019-09-10 17:00:30' , 2)
SELECT STATUS,MIN(DATE) AS INPUTDATE FROM TEST WHERE CAST(DATE AS DATE)='2019-09-09'
GROUP BY STATUS
输出
下表和查询将解决您的问题:
CREATE TABLE TEST
(
ID TINYINT,
DATE SMALLDATETIME,
STATUS TINYINT,
)
INSERT INTO TEST VALUES (1, '2019-09-09 09:00:00', 1),
(2 , '2019-09-09 09:02:36' , 1),
(3 , '2019-09-09 09:06:00' , 1),
(4 ,'2019-09-09 09:10:11' , 1),
(5 ,'2019-09-09 17:00:00' , 2),
(6 , '2019-09-09 17:05:00' , 2),
(7 , '2019-09-10 09:00:00' , 1),
(8 , '2019-09-10 09:02:32' , 1),
(9 , '2019-09-10 09:02:38' , 1),
(10 , '2019-09-10 17:00:00' , 2),
(11 ,' 2019-09-10 17:00:30' , 2)
SELECT STATUS,MIN(DATE) AS INPUTDATE FROM TEST WHERE CAST(DATE AS DATE)='2019-09-09'
GROUP BY STATUS
输出
您使用的是MySQL 8.0还是更早的版本?@Martin MySQL Ver 15.1发行版10.1.30-MariaDB,对于Win32 AMD64,我已编辑该问题以删除MySQL标记,并将其替换为MariaDB。请适当标记,因为这对于确定如何解决问题很重要problems@Martin谢谢,我会再等最好的answer@Martin谢谢,我试过他的答案,效果很好。你使用的是MySQL 8.0还是更早的版本?@Martin MySQL Ver 15.1 Distrib 10.1.30-MariaDB,对于Win32 AMD64,我已编辑了该问题以删除mysql标记,并将其替换为mariadb。请适当标记,因为这对于确定如何解决问题很重要problems@Martin谢谢,我会再等最好的answer@Martin谢谢,我尝试了他的答案,效果很好。从SELECT*中选择tbl_Attention.time,tbl_Attention.status,tbl_考勤中按状态按时间顺序划分的行数rn,其中时间>='2019-09-09'和时间>'2019-09-10't,其中rn=1status@JcJohn这是因为ROW_NUMBER仅在MySQL 8.0和later@JcJohn我相信我的语法是正确的。马丁:我不知道问题出在哪里。@Martin我对这个版本有什么建议吗?还是替换行号?@TimBiegeleisen行号在Maria 10.1.30中不可用。它是在10.2从SELECT*中选择tbl_Attention.time、tbl_Attention.status时引入的,tbl_考勤中按状态按时间顺序划分的行数rn,其中时间>='2019-09-09'和时间>'2019-09-10't,其中rn=1status@JcJohn这是因为ROW_NUMBER仅在MySQL 8.0和later@JcJohn我相信我的语法是正确的。马丁:我不知道问题出在哪里。@Martin我对这个版本有什么建议吗?还是替换行号?@TimBiegeleisen行号在Maria 10.1.30中不可用。它是在10.2中引入的
STATUS INPUTDATE
1 2019-09-09 09:00:00
2 2019-09-09 17:00:00