2016-07-29 56 views
2

使用SQL Server 2008 R2我試圖將每天存儲在表中的用戶的最後登錄時間放在一起。從MAX記錄中計數DATEDIFF

下面的查詢就會將該信息爲每個用戶:

SELECT 
    [Login_name], 
    MAX([last_login_time]) as Last_login_date, 
    [server_instance] 
FROM 
    [dbo].[User_Login_Audit] 
WHERE 
    Login_name NOT IN ('NT AUTHORITY\SYSTEM', 'sa','') 
GROUP BY 
    Login_name, server_instance 

結果如下:

User_name | 2016-07-28 | Server/Instance 

我要的是能夠增加GETDATE()之間的天數最大記錄日期並將其添加爲最後一列..

我已經嘗試使用以下代碼,但它會爲每天記錄的值返回f或該用戶。任何幫助將不勝感激,因爲我確信我錯過了一些明顯的東西。

SELECT 
    [Login_name], 
    MAX([last_login_time]) AS Last_login_date, 
    [server_instance], 
    DATEDIFF(day, getdate(), last_login_time) AS Days 
FROM 
    [dbo].[User_Login_Audit] 
WHERE 
    Login_name NOT IN ('NT AUTHORITY\SYSTEM', 'sa','') 
GROUP BY 
    Login_name, server_instance, last_login_time 
+0

你需要從集團的部分 – Mat

+0

只要我做,我得到的錯誤刪除_last_login_time_:消息8120,級別16,狀態1,第4行 列'dbo.User_Login_Audit.last_login_time'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。 – bwilliamson

回答

2

試試這個:

SELECT [Login_name], 
    max([last_login_time]) Last_login_date, 
    [server_instance], 
    DATEDIFF(day, getdate(), max([last_login_time])) Days 
FROM [dbo].[User_Login_Audit] 
where Login_name not in ('NT AUTHORITY\SYSTEM', 'sa','') 
Group by Login_name, server_instance 
+0

那一個做到了。非常感激。 – bwilliamson

+0

是的,只要您將'last_login_time'添加到group by子句中,就可以保證在'last_login_time'的每個值的輸出中獲得一行。 –

0
;with cte 
as 
(SELECT 
[Login_name] 
,max([last_login_time]) as Last_login_date 
,[server_instance], 
FROM [dbo].[User_Login_Audit] 
    where Login_name not in ('NT AUTHORITY\SYSTEM', 'sa','') 
Group by Login_name,server_instance 
) 
select *, 
DATEDIFF(day,getdate(),Last_login_date) 
from cte 
+0

這個解決方案也起作用。謝謝您的幫助。 – bwilliamson

0
SELECT 
    u1.[Login_name], 
    u1.[server_instance], 
    COALESCE(MAX(u2.[last_login_time]),'No previous') AS Last_login_date, 
    COALESCE(DATEDIFF(day, getdate(), MAX(u2.last_login_time)), 'No previous') AS Days 
FROM 
    [dbo].[User_Login_Audit] ua1 
    LEFT JOIN [dbo].[User_Login_Audit] ua2 ON ua1.[Login_name] = ua2.[Login_name] and 
               ua1.[server_instance] = ua2.[server_instance] and 
               u1.[last_login_time] > u2 .[last_login_time] 
WHERE 
    u1.Login_name NOT IN ('NT AUTHORITY\SYSTEM', 'sa','') 
GROUP BY 
    u1.Login_name, u1.server_instance