【问题标题】:SQL Server Selecting newest entry for each rowSQL Server 为每一行选择最新条目
【发布时间】:2011-09-21 04:31:01
【问题描述】:

我有一个这样的 SQL Server 表:

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

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

  • 网络扫描 - 与在扫描期间某些站点可能不可用的事实相吻合。

我想写的查询是:

"select every hostname having the latest datequeried" 

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

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

提前致谢。

【问题讨论】:

  • SELECT * FROM table WHERE datequeried = MAX(datequeried)?
  • 我注意到(而且大多数答案似乎都忽略了)datequeried 是 varchar 出于某种可怕的原因。我们至少可以希望它以字符串可排序的方式(例如 YYYYMMDD 或类似方式)存储日期(时间)值吗?您现在可以修改架构以使用更合适的数据类型(日期时间或(假设 20008 年)日期时间 2 或日期)吗?

标签: sql-server date select


【解决方案1】:

我可以显示所需的结果:

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

感谢所有帮助过的人。

【讨论】:

  • 如果答案正确,请将其标记为已接受。我已将您未注册的帐户与您已注册的帐户合并,您现在应该可以修改您的问题,在您收到的答案上留下 cmets 并接受答案。
【解决方案2】:
  1. 是否要查找每个站点的最新扫描?
  2. 或者您想查找在最近一次扫描期间在线(或不在线)的每个站点?

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

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

要回答 #2,您需要在 scandate = max(date) in主扫描列表。

【讨论】:

    【解决方案3】:
    SELECT TOP 1 WITH TIES * 
    FROM YourTable
    ORDER BY ROW_NUMBER() OVER(PARTITION BY hostname ORDER BY datequeried DESC)
    

    【讨论】:

      【解决方案4】:
      select hostname,
             max(datequeried) as datequeried
      from YourTable
      group by hostname
      

      【讨论】:

        【解决方案5】:

        从 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 行,每个返回的行都是一个

        【讨论】:

          【解决方案6】:

          如果您使用的是 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)。

          【讨论】:

            猜你喜欢
            • 2022-06-13
            • 1970-01-01
            • 1970-01-01
            • 2018-03-06
            • 1970-01-01
            • 2021-11-26
            • 1970-01-01
            • 1970-01-01
            • 2010-11-29
            相关资源
            最近更新 更多