当 SQL 出现最小值或最大值时,如何获取时间戳?

Posted

技术标签:

【中文标题】当 SQL 出现最小值或最大值时,如何获取时间戳?【英文标题】:How do I get timestamp when minimum or maximum value occur with SQL? 【发布时间】:2017-05-12 21:50:52 【问题描述】:

我有一个包含timestampvalue 列的数据库。日志记录是定期进行的。现在我想做每日汇总。已经这样做了:

SELECT
    strftime("%Y-%m-%d", timestamp) AS "new_timestamp",
    AVG(value) as value_avg,
    MIN(value) as value_min,
    MAX(value) as value_max,
    COUNT(*) as num_samples,
    /* ... something for when max and min value occurs */
FROM my_table
GROUP BY "new_timestamp"

:我如何获得时间戳/时间 MIN 或 MAX 在当天发生?

编辑:在我的具体情况下,如果有多个最小值或最大值,那么应该选择哪一个并不重要。我正在使用 SQLite。

【问题讨论】:

您使用的是哪个 dbms?如果一天中存在两次相同的最大值(或最小值),预期的结果是什么? SQL Select only rows with Max Value on a Column的可能重复 添加示例数据和预期结果您的 Q 不是很清楚 @jarlh,我正在使用 SQLite。抱歉忘了提。 @O.Jones,我将从那里尝试示例。真的不知道如何为此提出问题。 【参考方案1】:

strftime() 的使用表明您正在使用 SQLite。如果是这样,那么相关子查询可能是进行计算的最简单方法。

我认为以下方法会起作用:

SELECT strftime('%Y-%m-%d', timestamp) AS "new_timestamp",
       AVG(value) as value_avg,
       MIN(value) as value_min,
       MAX(value) as value_max,
       COUNT(*) as num_samples,
       (SELECT t2.timestamp
        FROM my_table t2
        WHERE strftime('%Y-%m-%d', t2.timestamp) = strftime('%Y-%m-%d', t.timestamp)
        ORDER BY value desc
       ) as timestamp_max,
       (SELECT t2.timestamp
        FROM my_table t2
        WHERE strftime('%Y-%m-%d', t2.timestamp) = strftime('%Y-%m-%d', t.timestamp)
        ORDER BY value asc
       ) as timestamp_min
FROM my_table t
GROUP BY "new_timestamp"

【讨论】:

以上是关于当 SQL 出现最小值或最大值时,如何获取时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:获取最大值和最小值,以及它们出现的时间戳

JavaScript 无法获取最大值或最小值或数组

设置最小值或最大值后如何刷新 jQuery UI 滑块?

从数据框中提取具有最小值或最大值的行

比较三个变量并获得最小/最大值的变量(不是值)

当出现故障时,获取时间戳中的 Min 和 MAX 行