SQL Server选择每行的最新条目

时间:2011-06-23 12:25:05

标签: sql-server date select

我有一个像这样的SQL Server表:

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

该表由一个预定作业填充,该作业扫描网络以查找Windows客户端PC本地管理员组成员。

  • 网络扫描 - 因为在扫描过程中可能会出现某些电台不可用的事实。

我想写的查询是:

"select every hostname having the latest datequeried" 

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

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

提前致谢。

6 个答案:

答案 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. 您想查找每个电台的最新扫描吗?
  2. 或者您想在最近的扫描期间找到在线(或不在线)的每个电台吗?
  3. 首先,我有一个工作站的主列表。然后我会有一个扫描主列表。然后我会有扫描表来保存扫描结果。

    要回答#1,您将使用子查询或内联视图为每​​个工作站返回其id和max(scandate),然后您将该子查询连接回扫描表以拉出扫描行工作站ID,其scandate与其max(scandate)匹配。

    要回答#2,你会在扫描表中查找存在记录(或者不存在记录,比照变通)的所有工作站,其中scandate = max(date)in主扫描列表。