2013-02-06 68 views
1

我有一個查詢,我想返回已登錄月份而不在下個月重複記錄的用戶數。非重複月度SQL

如果用戶已經登錄四月和五月,它只會顯示四月的一個記錄。這是我迄今爲止所擁有的。

SELECT DISTINCT (a.userid), EXTRACT(MONTH FROM a.loginTime) as month 
FROM login_audit a LEFT JOIN user u on u.userid = a.userid 
WHERE a.loginTime <= '2012-12-31 11:59:59' 
AND a.loginTime >= '2012-01-01 00:00:00' 
GROUP BY month 

到目前爲止記錄返回

userid month 
1  1 
2  1 
1  2 
3  2 

在這種情況下,用戶1出來爲1月和Februray。我希望它能省略那條記錄。要麼就是要積累。像這樣:

要麼

userid month 
1  1 
2  1 
3  2 

或者

userid month 
1  1 
2  1 
1  2 
2  2 
3  2 

我希望這是有道理的。如果您需要進一步澄清,請問任何問題。非常感謝!

+1

嘗試使用'GROUP BY a.userid'。 – fedorqui

+0

如果用戶有四月,五月和六月,您只想顯示四月?如果他還有十月和十一月,你是否想同時展示四月和十月? – fthiella

+0

嗨@fthiella是的,這是主意。如果用戶已登錄一年,則只需顯示一次。 –

回答

5

不要看到你需要的表用戶...

爲先 「想情景」:

SELECT 
    a.userid, 
    MIN(EXTRACT(MONTH FROM a.loginTime)) as month 
FROM login_audit a 
WHERE a.loginTime <= '2012-12-31 11:59:59' AND a.loginTime >= '2012-01-01 00:00:00' 
GROUP BY a.userid 
+0

你是一位學者和紳士。非常感謝!順便說一句,我需要用戶表按部門排序。我放棄了這個以縮短查詢,但我可以看到你的意思。再次感謝。 –

+1

@ sas1ni69太多的讚美,我臉紅了;)認爲有這樣的表用戶的東西,但...不在給定的樣本。別客氣 ! –

+0

你值得擁有它們! :D它真的幫助把解決方案變得比它更優雅:) –

1

我會用這種方法。

SELECT DISTINCT (a.userid), EXTRACT(MONTH FROM a.loginTime) as month 
FROM login_audit a 
WHERE a.loginTime <= '2012-12-31 11:59:59' 
AND a.loginTime >= '2012-01-01 00:00:00' 

and not exists 
(select userid 
from login_audit 
where login_audit.user_id = a.user_id 
and carry on with date range for the following month 
) 
+0

你好。非常感謝你,但這是舊的方法,它有點慢,但它確實有效。非常感謝。 –