我编写了一个按小时统计记录的查询:
select TO_CHAR(copied_timestamp, 'YYYY-MM-DD HH24'),count(*) from req group by
TO_CHAR(copied_timestamp, 'YYYY-MM-DD HH24');
结果是:
2012-02-22 13 2280
2012-02-22 15 1250
2012-02-22 16 1245
2012-02-22 19 1258
但我需要这样的结果:
2012-02-22 13 2280
2012-02-22 14 0
2012-02-22 15 1250
2012-02-22 16 1245
2012-02-22 17 0
2012-02-22 18 0
2012-02-22 19 1258
此外,我也有按天和月分组的查询!
select TO_CHAR(copied_timestamp, 'YYYY-MM-DD'),count(*) from req
group by TO_CHAR(copied_timestamp, 'YYYY-MM-DD');
select TO_CHAR(copied_timestamp, 'YYYY-MM'),count(*) from req
group by TO_CHAR(copied_timestamp, 'YYYY-MM');
我需要将他们的差距填充为零或零。 任何帮助都非常感谢。
注意:
在使用CONNECT BY
的oracle中有这个问题的答案,但我需要Mysql中的答案,因为Mysql不支持CONNECT BY
。
Here is the link
答案 0 :(得分:2)
生成单列dates_hours
表,其中包含合理范围内的所有日期和小时(例如,从1900到2200)。
然后从此表中执行LEFT JOIN
到您当前的查询。
要使此技术正确执行,您可能需要在表中添加一个索引列,其中包含已转换的时间戳(您的copied_timestamp
转换为DATETIME
,四舍五入到小时)
SELECT date_hour, count(req.converted_timestamp)
FROM
dates_hours
LEFT JOIN req ON req.converted_timestamp = dates_hours.date_hour
WHERE date_hour
BETWEEN (SELECT MIN(req.converted_timestamp) FROM req)
AND (SELECT MAX(req.converted_timestamp) FROM req)
GROUP BY date_hour
生成dates_hours
表:
CREATE TABLE dates_hours (date_hour DATETIME PRIMARY KEY);
DELIMITER $$$
CREATE PROCEDURE generate_dates_hours (to_date DATETIME)
BEGIN
DECLARE start_date DATETIME;
DECLARE inc INT;
SELECT MAX(date_hour) INTO start_date FROM dates_hours;
IF start_date IS NULL THEN
SET start_date = '1900-01-01';
END IF;
SET inc = 1;
WHILE start_date + INTERVAL inc HOUR <= to_date DO
INSERT INTO dates_hours VALUE (start_date + INTERVAL inc HOUR);
SET inc = inc +1;
END WHILE;
END $$$
DELIMITER ;
CALL generate_dates_hours('2200-01-01');
好的,既然我正在自我校对,我意识到这是一个非常牵强的解决方案。我希望有人能想出一个更优雅的人。
答案 1 :(得分:1)
我创建了一个名为TBL_NUMBERS
的表CREATE TABLE `TBL_NUMBER` (`n` int(11) NOT NULL)
并插入1到1000的记录。 现在我可以使用此查询生成任何类型的日期范围:
SELECT '2012-06-21' + INTERVAL n-1 [DAY | HOUR | MINUTE] or as dateRange
FROM TBL_NUMBER
WHERE '2012-06-21' + INTERVAL n-1 [DAY | HOUR | MINUTE] <= '2012-06-23';
然后我可以用我的结果加入这个表来填补日期空白。
如果我需要超过1000个日期范围,我可以在TBL_NUMBER
如果你有更好的想法,我很想知道;)