加入三个表,不同的用户,仅限最新日期(审计)

时间:2016-06-02 20:16:38

标签: sql sql-server database select subquery

我目前正在尝试此查询以生成正确的信息。我所得到的结果,但它们不正确。有三个表:

User_Details:包含一个巨大的用户列表,以及他们有权访问的服务器。下面,您将看到ServerA列出两次,因为它有两个用户:user001和user002。不是说这是最好的方法,但这就是我所掌握的。

SERVER      USER        CONNECTION
ServerA     user001     success
ServerA     user002     success
ServerB     user001     success
ServerA     user007     success
ServerB     user002     success
ServerB     user003     success
ServerC     user001     success
ServerC     user002     success
ServerC     user007     success

Server_Details:包含一堆服务器数据,大多数我不会在这里包含。这里主要关注的是它是一个独特/不同的服务器列表及其类型。这里的关键是我只包括'Developer'服务器。所以下面,通过正确编写的查询,它只会选择ServerC和ServerD,因为它们是“开发人员”。

SERVER      SQL SERVER EDITION  
ServerA     Standard            
ServerB     Standard        
ServerC     Developer       
ServerD     Developer       

Audit_Details。第三个表有很多数据。它将列出用户和他们登录的服务器。从技术上讲,它在这里被称为INSTANCE_NAME并被切断(想想“ServA”而不是“ServerA”)。无论如何,它列出了用户,服务器和登录的时间。

USER_ID     LAST_LOGON_TIME         INSTANCE_NAME
user001     2016-04-18 07:40:04     ServerA 
user002     2016-04-18 07:40:04     ServerA 
user002     2016-05-03 09:31:01     ServerB 
user002     2016-05-06 14:36:01     ServerC 
user003     2016-05-13 09:05:43     ServerB 
user007     2016-05-13 09:05:43     ServerA 
user007     2016-05-13 09:05:43     ServerC 

希望能够充分了解我正在使用的架构。我正在尝试编写一个查询,清楚地列出所有有权访问“Developer”服务器的用户,以及他们最后登录的位置(Audit_Details表中的INSTANCE_NAME字段)以及何时(Audit_Details表中的LAST_LOGON_TIME)。

我能得到任何帮助吗?以下查询是我到目前为止所做的,但它并没有按我的意愿行事。

select distinct u.[USER], s.[COMPUTER NAME], max([LAST_LOGON_TIME]) as [LAST LOGON TIME]
from [User_Details] u
  inner join [Server_Details] s
    on s.[Computer Name] = u.[SERVER]
  inner join [Audit_Details] a
    on a.[USER_ID] = u.[USER]
where s.[SQL Server Edition] LIKE 'dev%'
group by u.[USER], s.[COMPUTER NAME]        -- Need group by or it breaks. 
-- Error: 
-- "[USER] is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."
order by u.[USER] asc

理想情况下,查询类似于:

USER_ID     LAST_LOGON_TIME         LAST_SERVER_LOGGED_ON
user001     2016-04-18 07:40:04     ServerA 
user002     2016-04-18 07:40:04     ServerA 
user003     2016-05-03 03:31:01     ServerB 
user004     2016-05-06 14:36:01     ServerD 
user005     2016-05-13 12:05:43     ServerC 
user006     2016-05-26 09:09:43     ServerC 
user007     2016-05-29 11:05:43     ServerZ 

这样可以更轻松地编制活跃用户列表,可能是过去两周内登录过的用户,然后与几个月内未使用过用户的用户交谈。

1 个答案:

答案 0 :(得分:0)

这是另一种方式

select * from 
(
select distinct u.[USER], s.[COMPUTER NAME], [LAST_LOGON_TIME] as [LAST LOGON TIME]
,Row_number () over ( partition by u.[USER], s.[COMPUTER NAME] order by [LAST_LOGON_TIME] desc) rowid
from [User_Details] u
  inner join [Server_Details] s
    on s.[Computer Name] = u.[SERVER]
  inner join [Audit_Details] a
    on a.[USER_ID] = u.[USER]
    and a.instance_name = u.[SERVER]
where s.[SQL Server Edition] LIKE 'dev%'     
) as x
where rowid = 1


order by [USER] asc
相关问题