MySQL:使用SQL无法找出每天最繁忙的小时,其中包含最大的" in_bytes"?

时间:2014-11-07 19:36:17

标签: mysql hour

目标:编写正确的SQL来解决以下问题。

第1部分:

无法弄清楚如何获取时间戳的SQL语句,其中包括每天最大“in_bytes”的日期和小时。请参阅下面的“video_hourly”表DDL代码。如果在给定的一天中有两个具有相同值的最大值,则选择第一个。这些数据在高位图中绘制,因此每个给定日期只能有一个数据点。您可以在表格中填写一些示例数据。

第2部分:

此问题的另一部分是,如果您每天都拥有所有唯一的最大“in_bytes”,那么您需要将“in_bytes”和“out_bytes”相加以获得一条记录。

要将UTC时间从数据库转换为本地时间,我们在查询中使用它:

SELECT time_stamp,CONVERT_TZ(time_stamp, '+00:00', '-07:00' ) as localtime

以下是表的DDL SQL:

CREATE TABLE video_hourly (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  time_stamp datetime NOT NULL,
  in_bytes bigint(20) UNSIGNED NOT NULL DEFAULT 0,
  out_bytes bigint(20) UNSIGNED NOT NULL DEFAULT 0,
  opt_pct decimal(11, 2) NOT NULL DEFAULT 0.00,
  PRIMARY KEY (id)
)
ENGINE = INNODB;

对此有任何帮助或建议将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

请参阅您可以使用的datetime功能列表。具体来说,您可以使用HOUR()来获取小时值。

您还可以使用DATE()获取日期时间列的日期部分。一旦你有了这些,你可以将它们组合在一起。我会尝试为你分解。

这将通过按天和小时分组来返回该小时的日期,小时和in_bytes。

SELECT DATE(time_stamp) AS date, HOUR(time_stamp) AS hour, SUM(in_bytes) AS totalInBytes
FROM video_hourly
GROUP BY date, hour
ORDER BY date, hour, totalInBytes DESC;

这也是每组顶部的最大totalInBytes,因为它按降序排序。

另外,请参阅this question了解如何获取组中的最大值,在这种情况下,您希望获得每个日期的最大inBytes。

然后,您可以将查询更改为:

SELECT CONCAT(v.date, ' ', v.hour) AS dateAndHour, v.totalInBytes
FROM(SELECT time_stamp AS fullDate, DATE(time_stamp) AS date, HOUR(time_stamp) AS hour, SUM(in_bytes) AS totalInBytes
    FROM video_hourly
    GROUP BY date, hour
    ORDER BY date, hour, totalInBytes DESC
) v
WHERE(
    SELECT COUNT(*)
    FROM(SELECT DATE(time_stamp) AS date, HOUR(time_stamp) AS hour, SUM(in_bytes) AS totalInBytes
        FROM video_hourly
        GROUP BY date, hour
        ORDER BY date, hour, totalInBytes DESC
    ) vh
    WHERE vh.date = v.date AND vh.totalInBytes >= v.totalInBytes
) <= 1;

如果没有任何示例数据,我无法尝试,但如果你想尝试一下,这里有一个SQL Fiddle链接。我用这个来确保它不会产生任何错误。