2016-07-29 53 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