2013-10-07 117 views
2

我有模式三個表如下:分組在SQL查詢

請檢查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 | 

現在,如果說就是用戶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. 在臺主機,這些應用程序與DEVICE_ID的1,1,1,4,3
  3. 對於相關本月(05-2013)爲device_id = 1,start_time的最新值爲:2013-05-12 06:22:45(來自桌面主機,應用程序),所以在表中使用,查找appid = 2的組合,hostid = 2,其中有兩行,一個因子爲Low和其他介質,
  4. 對於本月(05-2013)的device_id = 4,通過遵循相同的過程,我們得到一個條目,即0低
  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 
    ) 

回答

0

您需要了解使用GROUP BY的。那就是你想要的。您可以將結果分組到獨立組中,並獨立使用這些組的計數和聚合函數。這是basic tutorial

+0

謝謝。我經歷了一個類似的指南,並嘗試了兩天,但看起來這種情況對我來說太複雜了 –