我有模式三個表如下:複雜的SQL查詢建議,請
表:應用
| 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
)
請檢查sqlfiddle:http://sqlfiddle.com/#!2/55fc2
你可能需要編輯澄清這個問題。我的答案和@ ubik404都可以是有效的,具體取決於你想要的行爲。 – Dan
@丹我只能看到你的答案。我正在測試它。謝謝。 – user2818666