GROUP BY与日期范围

时间:2011-02-17 19:51:59

标签: sql mysql group-by

我有一个包含4列的表,idStream,即文本,Duration(int)和Timestamp(日期时间)。每次有人在我的网站上播放特定的音频流时都会插入一行。 Stream是名称,Duration是他们正在收听的时间(以秒为单位)。我目前正在使用以下查询来计算一年中每周的总听众时间:

SELECT YEARWEEK(`Timestamp`), (SUM(`Duration`)/60/60) FROM logs_main
WHERE `Stream`="asdf" GROUP BY YEARWEEK(`Timestamp`);

这符合我的预期......在有数据的一年中,每周都会提供总听音时间。

但是,我想构建一个查询,其中我有几周的结果行,可能没有任何数据。例如,如果2006年的第26周没有属于该周的行,那么我希望SUM结果为0。

有可能这样做吗?也许是以某种方式在日期范围内加入?

2 个答案:

答案 0 :(得分:2)

尝试过一个真正的旧学校解决方案是设置另一个表,其中包含一组日期范围,您可以将这些日期范围外部加入以进行分组(因为在另一个表中将包含其中的所有周数以及开始/结束日期)。

在这种情况下,您可以使用满是YEARWEEK值的表:

201100
201101
201102
201103
201104

这是sql语句的草图:

SELECT year_weeks.yearweek , (SUM(`Duration`)/60/60) 

FROM year_weeks LEFT OUTER JOIN logs_main
   ON year_weeks.yearweek = logs_main.YEARWEEK(`Timestamp`)

WHERE `Stream`="asdf" GROUP BY year_weeks.yearweek;

答案 1 :(得分:0)

这是一个建议。可能不是你想要的。

但是说你有一个简单的表,其中一列[year_week]包含值1,2,3,4 ...

理论上你可以:

SELECT

A.year_week, 
(SELECT SUM('Duration')/60/00) FROM logs_main WHERE
 stream = 'asdf' AND YEARWEEK('TimeStamp') = A.year_week GROUP BY YEARWEEK('TimeStamp')) 

FROM

tblYearWeeks A 

这显然需要一些调整...我已经在其他项目中完成了几个类似的查询,这取决于具体情况。

如果您正在寻找一个基于表/ sql的解决方案,那么这也是我感兴趣的东西!