2

我有三个表,其架构如下:

请检查 sqlfiddlehttp ://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 是用户 ID,我想获取过去 6 个月中每个“因素”月份的每个月(所有应用程序)的表行数

如果 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      |

这是如何计算的?

  1. 对于 2013 年 5 月 (05-2013) 月份,表格应用程序中有两个应用程序
  2. 在 Hosts 表中,这些应用与 device_id 的 1,1,1,4,3 相关联
  3. 本月(05-2013)对于device_id=1,start_time的最新值为:2013-05-12 06:22:45(来自表hosts,apps),所以在表Usage中寻找appid=2&hostid的组合=2,其中有两行,其中一个因子为 Low,另一个为 Medium,
  4. 对于本月(05-2013),对于 device_id=4,按照相同的程序,我们得到一个条目,即 0 Low
  5. 同样,计算所有值。

要通过查询获得过去 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
    ) 
4

1 回答 1

0

您需要了解 GROUP BY 的使用。这就是你要找的。您可以将结果分组到独立的组中,并在这些组上独立使用计数和聚合函数。这是一个基本教程

于 2013-10-07T18:58:55.113 回答