2011-06-23 79 views
4

最新的项目我有这样一个SQL Server表:SQL服务器选择的每一行

id(autoincrement) 
hostname(varchar) 
group(varchar) 
member(varchar) 
datequeried(varchar) 

该表由扫描网络的Windows客户端PC的本地管理员组成员预定作业填满。

  • 网络扫描 - 接缝事实上可能发生某些站点在扫描期间不可用。

,我想要写入的查询是:

"select every hostname having the latest datequeried" 

这是为了显示查询网络上的每个主机名的最新结果(行)。

是否清楚? 我仍然面临一些语法问题,我相信这很容易。

在此先感谢。

+0

'SELECT * FROM table WHERE datequeried = MAX(datequeried)'? –

+1

我注意到(和大多数答案似乎已经忽略),由于一些可怕的原因,datequeried是'varchar'。我们能否至少希望它将日期(时间)值以字符串排序的方式存储(例如YYYYMMDD或类似的)?您现在可以修改模式以使用更合适的数据类型(日期时间或(假设为20008)日期时间2或日期)? –

回答

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 

SELECT的CTE“内按hostname分区“数据,例如每个hostname获得一组新的“数据组”,并为每个组编号从1开始的条目。这些条目按datequeried DESC编号,所以最近的条目对于每组数据(例如对于每个hostname)具有RowNum = 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,基本上只是别名,首先选择哪一个,我可以在第二查询,则使用。

这将返回1行的每个主机名,与该行返回每个都是一个

0
select hostname, 
     max(datequeried) as datequeried 
from YourTable 
group by hostname 
0
SELECT TOP 1 WITH TIES * 
FROM YourTable 
ORDER BY ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC) 
0
  1. 你想找到每个站最近的扫描?
  2. 或者您想查找在最近一次扫描期间在线(或不在线)的每一个电台吗?

我会首先列出一个工作站主列表。然后我会有一个主扫描列表。然后我会拥有扫描结果的扫描表。

要回答#1,您应该使用子查询或内联视图,它为每个工作站返回其id和max(scandate),然后您将该子查询加入到扫描表中以提取扫描行该scandate与其max(scandate)匹配的工作站ID。

要回答#2,你会寻找其中存在的记录的所有工作站(或者不存在的记录,比照)在扫描表,其中钪=最大值(日期)在主扫描列表。

1

我可以用显示所需要的结果:

select hostname, member, max(lastdatequeried) 
    as lastdatequeried 
    from members 
    group by hostname, member order by hostname 

感谢所有谁帮助。

+0

如果是正确答案,请将其标记为已接受。我已将您的未注册帐户与您注册的帐户合并,您现在应该能够修改您的问题,对您收到的答案发表评论并接受答案。 –