mysql - 如何获取每组中的最大值和最小值以及它们的时间?

标签 mysql sql greatest-n-per-group mysql-5.6

假设我有一个表 MyTable,其中包含 Id、NumericValue 和 UTCTimestamp 列。我试图按时间戳的小时对表 MyTable 的结果进行分组,并返回每个组的最大 NumericValue 及其关联的时间戳,以及每个组的最小 NumericValue 及其关联的时间戳值。

现在,我可以通过以下查询解决问题的第一部分:

SELECT 
    HOUR(t.UTCTimestamp) AS `Hour`, 
    t.NumericValue AS MaximumValue,
    t.UTCTimestamp AS MaximumValueTime
FROM MyTable t
INNER JOIN (
    SELECT HOUR(t2.UTCTimestamp) AS `Hour`, MAX(t2.NumericValue) AS NumericValue
    FROM MyTable t2
    GROUP BY HOUR(t2.UTCTimestamp)
) maxNumericValue ON HOUR(t.UTCTimestamp) = maxNumericValue.`Hour` AND t.NumericValue = maxNumericValue.NumericValue
GROUP BY HOUR(t.UTCTimestamp);

灵感来自this answer .

Here's an MVCE .

我怎样才能显示每个组的最小值以及与其关联的时间戳?

最佳答案

从 MySQL 8.0 开始,您可以使用 ROW_NUMBER:

WITH cte AS (
  SELECT *,ROW_NUMBER() OVER(PARTITION BY HOUR(UTCTimestamp) 
                              ORDER BY UTCTimestamp ASC)  AS rn
          ,ROW_NUMBER() OVER(PARTITION BY HOUR(UTCTimestamp) 
                              ORDER BY UTCTimestamp DESC) AS rn2
  FROM MyTable
)
SELECT HOUR(c1.UTCTimestamp),
     c1.ID, c1.NumericValue, c1.UTCTimestamp,  -- min row
     c2.ID, c2.NumericValue, c2.UTCTimestamp   -- max row
FROM cte c1
JOIN cte c2
  ON HOUR(c1.UTCTimestamp) = HOUR(c2.UTCTimestamp)
  AND c1.rn=1
  AND c2.rn2=1
ORDER BY HOUR(c1.UTCTimestamp) ASC;

<强> DBFiddle Demo

关于mysql - 如何获取每组中的最大值和最小值以及它们的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50160739/

相关文章:

javascript - 有没有办法让函数在完成后立即采取行动?

MySQL : 1 relational table with 3 colmuns OR 3 relational tables with 2 columns?

MySQL:约束两个字段中的至少一个

sql - View 和带有 where 子句的查询之间的性能差异

sql - 如何从表中选择每一行,并按连接表中最相关的 "recent (timestamp)"行对它们进行排序?

sql - Postgresql 从 max tuple 获取其他信息

mysql - 连接两个表,其中表 A 有一个日期值,需要在 B 中找到 A 中日期下方的下一个日期

PHP/MYSQL - Insert into ignore,忽略指定列

mysql - 假设父表永远由一行组成,我是否需要一对多关系?

mysql - 尝试更改列默认值时未获得预期输出