3

在此处输入图像描述

我有一个包含以下条目的表:

completed_time||   BOOK_CNT
*********************************************
2013-07-23    | 2
2013-07-22    | 1
2013-07-19    | 3
2013-07 16    |5
2013-07-12    |4
2013-07-11    |2
2013-07-02    |9
2013-06-30    |5

现在,我想使用上面的条目进行数据分析。

假设 DAYS_FROM、DAYS_TO 和 PERIOD 是三个变量。

我需要触发以下类型的查询:

"以 PERIOD 为间隔,从 DAYS_FROM 到 DAYS_TO 的总图书。 "

DAYS_FROM是格式为 YYYY-MM-DD 的日期

, DAYS_TO是格式为 YYYY-MM-DD 的日期

PERIOD是 {1W,2W,1M,2M,1Y},其中 W,M,Y 代表 WEEK、MONTH 和 YEAR。

示例:查询 DAYS_FROM=2013-07-23 、 DAYS_TO=2013-07-03 和 PERIOD=1W 应返回:

ith week - total
1 -        3
2-         8
3-         6 
4-         14

说明

1-3 means (The total book from 2013-07-21(sun) to 2013-07-23(tue) is 3 )
2-8 means (The total book from 2013-07-14(sun) to 2013-07-21(sun) is 8 )
3-16 means (The total book from 2013-07-07(sun) to 2013-07-14(sun) is 6 )
4-14 means (The total book from 2013-07-03(wed) to 2013-07-07(sun) is 14 )

请参阅日历图片以获得更好的理解

如何触发这样的查询?

我试过什么?

 SELECT DAY(completed_time), COUNT(total) AS Total
  FROM my_tab
 WHERE completed_time BETWEEN '2013-07-23' - INTERVAL 1 WEEK AND '2013-07-03'
 GROUP BY DAY(completed_time);

上述查询从 2013-07-23 中减去 7 天,因此将 2013-07-16 到 2013-07-23视为第一周将 2013-07-09 到 2013-07-16视为第二周,依此类推。

4

1 回答 1

1

一个简单的起点如下所示,当然您可能需要调整ith值以满足您的需要;

SET @period='1M';

SELECT CASE WHEN @period='1Y' THEN YEAR(completed_time) 
            WHEN @period='1M' THEN YEAR(completed_time)*100+MONTH(completed_time)
            WHEN @period='2M' THEN FLOOR((YEAR(completed_time)*100+MONTH(completed_time))/2)*2
            WHEN @period='1W' THEN YEARWEEK(completed_time)
            WHEN @period='2W' THEN FLOOR(YEARWEEK(completed_time)/2)*2
       END ith,
       SUM(BOOK_CNT) Total
FROM my_tab
GROUP BY ith
ORDER BY ith DESC;

一个用于测试的 SQLfiddle

于 2013-07-24T09:34:52.273 回答