【问题标题】:Retrieve the first data from multiple almost the same or correct data in table从表中多个几乎相同或正确的数据中检索第一个数据
【发布时间】:2020-01-15 02:57:00
【问题描述】:

如何从具有多个相同数据的查询中检索数据?像这样的东西。我有这样的数据表示:

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 的参数返回类似的东西:

1   2019-09-09 09:00:00       1
5   2019-09-09 17:00:00       2

我想返回插入的第一个数据。

【问题讨论】:

  • 您使用的是 MySQL 8.0 还是更早的版本?
  • @Martin mysql Ver 15.1 Distrib 10.1.30-MariaDB,适用于 Win32 (AMD64)
  • 我已编辑问题以删除 mysql 标签并将其替换为 mariadb。请适当标记,因为这对于确定如何解决问题很重要
  • @Martin 谢谢,我会等待另一个最佳答案
  • @Martin 谢谢我已经尝试过他的回答并且成功了。

标签: sql database mariadb greatest-n-per-group


【解决方案1】:

使用ROW_NUMBER

SELECT id, Time, Status
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Status ORDER BY Time) rn
    FROM yourTable
    WHERE Time >= '2019-09-09' AND Time < '2019-09-10'
) t
WHERE rn = 1
ORDER BY 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;

【讨论】:

  • SELECT tbl_attendance.time, tbl_attendance.status FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY STATUS ORDER BY time) rn FROM tbl_attendance WHERE time >= '2019-09-09' AND时间
  • @JcJohn 那是因为 ROW_NUMBER() 仅适用于 MySQL 8.0 及更高版本
  • @JcJohn 我相信我的语法是正确的。不知道是什么问题。
  • @Martin 对我的版本有什么建议吗?还是替换 Row_number?
  • @TimBiegeleisen ROW_NUMBER() 在 Maria 10.1.30 中不可用。它是在 10.2 中引入的
【解决方案2】:

下表和查询将解决您的问题:

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 

输出

STATUS  INPUTDATE
1   2019-09-09 09:00:00
2   2019-09-09 17:00:00

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多