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