获取对应于最低时间的DateTime

我想获取日期和ID,分别对应于最短时间和最大时间,以及下表中ID为5和4的极端行。

请注意以下几点:

  • 日期存储为ms中的值
  • 该ID反映了Order By Date ASC
  • 在下面我将时间分配清楚了
  • *表示要返回的两行。
  • 值应作为列返回,即:SELECT minID,minDate,maxID,maxDate FROM myTable
| ID | Date                | Timeonly  |
|----|---------------------|-----------|
| 5  | 14/11/2019 10:01:29 | 10:01:29* |
| 10 | 15/11/2019 10:01:29 | 10:01:29  |
| 6  | 14/11/2019 10:03:41 | 10:03:41  |
| 7  | 14/11/2019 10:07:09 | 10:07:09  |
| 11 | 15/11/2019 12:01:43 | 12:01:43  |
| 8  | 14/11/2019 14:37:16 | 14:37:16  |
| 1  | 12/11/2019 15:04:50 | 15:04:50  |
| 9  | 14/11/2019 15:04:50 | 15:04:50  |
| 2  | 13/11/2019 18:10:41 | 18:10:41  |
| 3  | 13/11/2019 18:10:56 | 18:10:56  |
| 4  | 13/11/2019 18:11:03 | 18:11:03* |

peak288 回答:获取对应于最低时间的DateTime

MySQL 8+的一个选项,结合使用ROW_NUMBER和旋转逻辑:

WITH cte AS (
    SELECT *,ROW_NUMBER() OVER (ORDER BY TimeOnly) rn_min,ROW_NUMBER() OVER (ORDER BY Date TimeOnly) rn_max
    FROM yourTable
)

SELECT
    MAX(CASE WHEN rn_min = 1 THEN ID END) AS minID,MAX(CASE WHEN rn_min = 1 THEN Date END) AS minDate
    MAX(CASE WHEN rn_max = 1 THEN ID END) AS maxID,MAX(CASE WHEN rn_max = 1 THEN Date END) AS maxDate
FROM cte;

这是MySQL 5.7或更早版本的一个选项:

SELECT
    MAX(CASE WHEN pos = 1 THEN ID END) AS minID,MAX(CASE WHEN pos = 1 THEN Date END) AS minDate
    MAX(CASE WHEN pos = 2 THEN ID END) AS maxID,MAX(CASE WHEN pos = 2 THEN Date END) AS maxDate
FROM
(
    SELECT ID,Date,1 AS pos FROM yourTable
    WHERE TimeOnly = (SELECT MIN(TimeOnly) FROM yourTable)
    UNION ALL
    SELECT ID,2 FROM yourTable
    WHERE TimeOnly = (SELECT MAX(TimeOnly) FROM yourTable)
) t;

第二个5.7选项使用类似的枢轴逻辑,但是代替ROW_NUMBER的是使用子查询来标识最小和最大记录。使用联合将这些记录与一个标识符结合在一起,以跟踪哪个记录是最小/最大。

,

在早期版本的MySQL中,您可以使用几个内联查询。这是一个简单易用的选项,在这里可能会非常有效:

select 
    (select ID from mytable order by TimeOnlylimit 1) minID,(select Date from mytable order by TimeOnly limit 1) minDate,(select ID from mytable order by TimeOnly desc limit 1) maxID,(select Date from mytable order by TimeOnly desc limit 1) maxDate
,

您可以简单地执行以下操作:

SELECT minval.ID,minval.Date,maxval.ID,maxval.Date
FROM (
    SELECT ID,Date
    FROM t
    ORDER BY CAST(Date AS TIME)
    LIMIT 1
) AS minval
CROSS JOIN (
    SELECT ID,Date
    FROM t
    ORDER BY CAST(Date AS TIME) DESC
    LIMIT 1
) AS maxval

如果要两行,则将CROSS JOIN查询更改为UNION ALL查询。

Demo on db<>fiddle

本文链接:https://www.f2er.com/3096288.html

大家都在问