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