我目前正在尝试此查询以生成正确的信息。我所得到的结果,但它们不正确。有三个表:
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
这样可以更轻松地编制活跃用户列表,可能是过去两周内登录过的用户,然后与几个月内未使用过用户的用户交谈。
答案 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