SELECT AVG(data) AS data, dateReg
FROM table
GROUP BY YEAR(dateReg), MONTH(dateReg), DAY(dateReg) ORDER BY dateReg
以上数据返回
1.75, 21 Jan 2010
9.45, 22 Jan 2010
3.96, 23 Jan 2010
2.68, 30 Jan 2010
它的错过日期从24日到29日,我们可以这样做,所以返回值是:
1.75, 21 Jan 2010
9.45, 22 Jan 2010
3.96, 23 Jan 2010
0, 24 Jan 2010
0, 25 Jan 2010
0, 26 Jan 2010
0, 27 Jan 2010
0, 28 Jan 2010
0, 28 Jan 2010
2.68, 30 Jan 2010
答案 0 :(得分:5)
您通常通过使用 值表 来加入此类事物,即包含您感兴趣的所有值的表格。
典型值表可以包含例如0到1,000之间的所有整数值,或给定时间段的所有日期。通常,Value表包含的值多于预期值,我们通过在WHERE子句中添加过滤器来获得所需的确切输出。
在这种情况下,您将需要一个包含日期的表格。假设此表名为ValTableDates并且包含2005年1月到2010年12月之间的所有日期,则查询将如下所示:
SELECT AVG(data) AS data, VT.ValDate
FROM ValTableDates VT
LEFT JOIN table T ON T.dateReg = VT.ValDate
WHERE VT.ValDate > [Some Start Date] and VT < [Some End Date]
GROUP BY YEAR(dateReg), MONTH(dateReg), DAY(dateReg)
ORDER BY dateReg
上述查询可能需要稍微调整才能得到零值而不是NULL,但重点是值表通常是为丢失数据点提供输出记录的最简单方法。
另一种方法是使用在子查询中生成所需[日期]序列的函数/表达式,但这通常效率较低且更容易出错。