2
我有模式三個表如下:分組在SQL查詢
請檢查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 |
現在,如果說就是用戶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 |
這是如何計算的?
- 單月2013年5月(05-2013),還有從表應用兩個應用程序
- 在臺主機,這些應用程序與DEVICE_ID的1,1,1,4,3
- 對於相關本月(05-2013)爲device_id = 1,start_time的最新值爲:2013-05-12 06:22:45(來自桌面主機,應用程序),所以在表中使用,查找appid = 2的組合,hostid = 2,其中有兩行,一個因子爲Low和其他介質,
- 對於本月(05-2013)的device_id = 4,通過遵循相同的過程,我們得到一個條目,即0低
- 類似地,計算所有的值。
要獲得通過查詢最近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
)
謝謝。我經歷了一個類似的指南,並嘗試了兩天,但看起來這種情況對我來說太複雜了 –