<分区>
我有三个表,架构如下:
请检查sqlfiddle:http://sqlfiddle.com/#!2/55fc2
表:应用
| ID (bigint) | USERID (Bigint)| START_TIME (datetime) |
-------------------------------------------------------------
| 1 | 13 | 2013-05-03 04:42:55 |
| 2 | 13 | 2013-05-12 06:22:45 |
| 3 | 13 | 2013-06-12 08:44:24 |
| 4 | 13 | 2013-06-24 04:20:56 |
| 5 | 13 | 2013-06-26 08:20:26 |
| 6 | 13 | 2013-09-12 05:48:27 |
表:主机
| ID (bigint) | APPID (Bigint)| DEVICE_ID (Bigint) |
-------------------------------------------------------------
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 1 | 1 |
| 4 | 3 | 3 |
| 5 | 1 | 4 |
| 6 | 2 | 3 |
表:用法
| ID (bigint) | APPID (Bigint)| HOSTID (Bigint) | Factor (varchar) |
-------------------------------------------------------------------------------------
| 1 | 1 | 1 | Low |
| 2 | 1 | 3 | High |
| 3 | 2 | 2 | Low |
| 4 | 3 | 4 | Medium |
| 5 | 1 | 5 | Low |
| 6 | 2 | 2 | Medium |
现在,如果 put 是 userid,我想获取过去 6 个月每个“因素”月份的每个月(所有应用程序)表格行的行数。。 p>
如果 DEVICE_ID 在一个月内出现不止一次(基于 START_TIME,基于加入应用程序和主机),计算计数时仅考虑最新行的使用情况(基于应用程序、主机和使用情况的组合)。
上述示例查询的示例输出应为:(对于输入用户 id=13)
| MONTH | USAGE_COUNT | FACTOR |
-------------------------------------------------------------
| 5 | 0 | High |
| 6 | 0 | High |
| 7 | 0 | High |
| 8 | 0 | High |
| 9 | 0 | High |
| 10 | 0 | High |
| 5 | 2 | Low |
| 6 | 0 | Low |
| 7 | 0 | Low |
| 8 | 0 | Low |
| 9 | 0 | Low |
| 10 | 0 | Low |
| 5 | 1 | Medium |
| 6 | 1 | Medium |
| 7 | 0 | Medium |
| 8 | 0 | Medium |
| 9 | 0 | Medium |
| 10 | 0 | Medium |
这是如何计算的?
- 2013 年 5 月 (05-2013),表 Apps 中有两个 App
- 在表 Hosts 中,这些应用与 device_id 的 1,1,1,4,3 相关联
- 本月 (05-2013) 对于 device_id=1,start_time 的最新值为:2013-05-12 06:22:45(来自表 hosts、apps),因此在表 Usage 中,查找组合appid=2&hostid=2 其中有两行,其中一行的因子为 Low,另一行为 Medium,
- 本月 (05-2013) 对于 device_id=4,按照相同的程序我们得到一个条目,即 0 Low
- 同样计算所有值。
要通过查询获取最近 6 个月的信息,我尝试使用以下方法获取它:
SELECT MONTH(DATE_ADD(NOW(), INTERVAL aInt MONTH)) AS aMonth
FROM
(
SELECT 0 AS aInt UNION SELECT -1 UNION SELECT -2 UNION SELECT -3 UNION SELECT -4 UNION SELECT -5
)