目标:编写正确的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;
对此有任何帮助或建议将非常感激。谢谢!
答案 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链接。我用这个来确保它不会产生任何错误。