我有一个像这样的SQL Server表:
id(autoincrement)
hostname(varchar)
group(varchar)
member(varchar)
datequeried(varchar)
该表由一个预定作业填充,该作业扫描网络以查找Windows客户端PC本地管理员组成员。
我想写的查询是:
"select every hostname having the latest datequeried"
这是显示在网络上查询的每个主机名的最新结果(行)。
清楚吗? 我仍然面临一些语法问题,我确信这很容易。
提前致谢。
答案 0 :(得分:2)
如果您使用的是SQL SErver 2005或更新版(您没有指定...),则可以使用CTE执行此操作:
;WITH MostCurrent AS
(
SELECT
id, hostname, group,
member, datequeried,
ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC) 'RowNum'
FROM
dbo.YourTable
)
SELECT *
FROM MostCurrent
WHERE RowNum = 1
CTE内部的SELECT
会按hostname
“对您的数据进行”分区“,例如每个hostname
获取一个新的“数据组”数据,并为每个组编号从1开始的条目。这些条目的编号为datequeried DESC
,因此最新的条目为RowNum = 1
- 每组数据(例如每个hostname
)。
答案 1 :(得分:1)
从SQL 2005及更高版本开始,您可以像这样使用ROW_NUMBER():
;WITH CTE AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC) AS RowNo
FROM YourTable
)
SELECT * FROM CTE WHERE RowNo = 1
“CTE”是Commom Table Expression,基本上只是第一个SELECT的别名,我可以在第二个查询中使用它。
这将为每个主机名返回1行,每行返回一行
答案 2 :(得分:1)
我可以使用以下方式显示所需的结果:
select hostname, member, max(lastdatequeried)
as lastdatequeried
from members
group by hostname, member order by hostname
感谢所有帮助过的人。
答案 3 :(得分:0)
select hostname,
max(datequeried) as datequeried
from YourTable
group by hostname
答案 4 :(得分:0)
SELECT TOP 1 WITH TIES *
FROM YourTable
ORDER BY ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC)
答案 5 :(得分:0)
首先,我有一个工作站的主列表。然后我会有一个扫描主列表。然后我会有扫描表来保存扫描结果。
要回答#1,您将使用子查询或内联视图为每个工作站返回其id和max(scandate),然后您将该子查询连接回扫描表以拉出扫描行工作站ID,其scandate与其max(scandate)匹配。
要回答#2,你会在扫描表中查找存在记录(或者不存在记录,比照变通)的所有工作站,其中scandate = max(date)in主扫描列表。