当前位置: 首页 > 面试题库 >

MySQL GROUP BY并填充空行

闽哲
2023-03-14
问题内容

我敢肯定这已经得到回答,但是我找不到我需要的详细信息。

对于分析系统,我需要能够对行进行分组并按 分钟 ,小时,天,月或年对行进行归还。我可以正常工作(下面的示例代码)。

SELECT COUNT( DISTINCT user_id ) ,  `hour` ,  `timestamp` 
FROM tracking_request
WHERE site_id =  '3'
AND  `timestamp` <  '2011-08-31 04:05:45'
AND  `timestamp` >  '2011-08-29 22:00:00'
GROUP BY  `hour` ,  `day` ,  `month` ,  `year` 
ORDER BY  `timestamp` ASC

问题是,像大多数图表一样,我需要填补数据不存在的空白(例如,最近3分钟没有行)。我读过有关创建“日历表”并连接该数据的信息,但是我如何才能针对每个刻度有效地做到这一点(例如,一年会比分钟容易得多,因为一分钟需要表中有很多行)?如果有帮助,则表中的每个字段都有一列(如上所示,您可以看到“小时”,“天”等)。

编辑:

我最终使用PHP通过使用一个空数组然后填充它来实现这一点。如果有人能想到一个全(或大部分)SQL解决方案,那就更好了。


问题答案:

在此答案中,我将概述如何生成日历表。

创建三个表,分别表示天,小时和分钟:

CREATE TABLE days (
  day DATE,
  PRIMARY KEY (day)
) 
CREATE TABLE hours (
  hour INT,
  PRIMARY KEY (hour)
) 
CREATE TABLE minutes (
  minute INT,
  PRIMARY KEY (minute)
)

用0到23的数字填充小时表,用0到59的数字填充分钟表。要填充天表,可以创建如下过程:

CREATE PROCEDURE make_days(IN start_date DATE, IN end_date DATE)
BEGIN
  DECLARE curr_date DATE;
  SET curr_date = start_date;
  WHILE curr_date <= end_date DO
    INSERT IGNORE INTO days(day)  VALUES(curr_date);
    SET curr_date = DATE_ADD(curr_date, INTERVAL 1 DAY);
  END WHILE;
END

然后,您可以调用此过程来创建如下日期:

CALL make_days('2011-01-01','2012-12-31');

现在,您可以使用类似于以下内容的查询为给定时间间隔中的每一分钟创建值:

SELECT YEAR(day) AS year, MONTH(day) AS month, DAYOFMONTH(day) AS day, hour, minute
FROM days, hours, minutes
WHERE CAST(CONCAT(day,' ',hour,':',minute) AS DATETIME) BETWEEN '2011-08-31 22:00' AND '2011-09-01 10:00'
ORDER BY year, month, day, hour, minute


 类似资料:
  • 第一个类称为FileReader,它读取一个逐行写入的txt文件,我们需要的每个字段都用“;”分隔,例如(“哥伦比亚大学”;“美国”;78.86;2012)。每行包含2个字符串(大学名和国家)和2个数字(分数和年份)。FileReader类在读取txt文件后,在ArrayList中返回其内容。 该作业的第二个类称为UniversityScores,它有4个字段(uniname、country、sc

  • 我试图输出一个矩阵:

  • 我喜欢用基于其他列的Formel填充列中的空值: 你能看出我的代码有什么问题吗?因为这段代码后面有一些nulll值。 我的数据框: Datadate|datacqtr 2002-02-28|2002Q1 Dataacqtr代表四分之一。有时我有datadate,但没有datacqtr(四分之一)。所以我喜欢填充基于colmn数据的colmn datacqtr。

  • 我有一个页眉和页脚(),中间有一个。

  • 当创建一个应用时,你将会想将多个控件放入一个窗口控件。我们的第一个 helloworld 范例仅仅使用了一个控件,因而我们可以只是简单地调用一个gtk_container_add()将控件填充到一个窗口控件。但是当你想要向窗口控件中放置超过一个控件时,控制每一个控件的位置和大小就变得很重要了。这就是接下来要讲的填充。 GTK+自带了大量各种布局的容器,这些容器的目的是控制被添加到他们的子控件的布局

  • 我一直在使用View Pager的图片幻灯片,但是我无法使View Pager内部的图像视图填充View Pager内部水平和垂直的完整空间。知道怎么做吗? 我在我的页面适配器中尝试过这个 但还是没有运气:( 我的布局 null 我的PageAdapter