【问题标题】:Select row by latest datetime按最新日期时间选择行
【发布时间】:2014-11-20 22:31:48
【问题描述】:

我有以下视图,它从 PERFMON 创建的原始表中提取行。每 60 秒插入一个新行。

SELECT        
    dbo.CounterDetails.MachineName, dbo.CounterDetails.ObjectName, 
    dbo.CounterDetails.CounterName, dbo.CounterDetails.InstanceName, 
    dbo.CounterData.CounterValue, CONVERT(DATETIME, CONVERT(VARCHAR(16), 
    dbo.CounterData.CounterDateTime)) AS Date, dbo.CounterData.GUID
FROM            
    dbo.CounterData 
INNER JOIN
    dbo.CounterDetails ON dbo.CounterData.CounterID = dbo.CounterDetails.CounterID 
INNER JOIN
    dbo.DisplayToID ON dbo.CounterData.GUID = dbo.DisplayToID.GUID

选择 * 会返回的地方,例如

    GUID    CounterID   RecordIndex CounterDateTime CounterValue    FirstValueA FirstValueB SecondValueA    SecondValueB    MultiCount
    362035A1-50A6-4F91-9423-82DCB5DED11B    1   1   2014-11-20 12:35:30.635 7459    7459    0   0   0   1
...
...
...

    GUID    CounterID   RecordIndex CounterDateTime CounterValue    FirstValueA FirstValueB SecondValueA    SecondValueB    MultiCount
    362035A1-50A6-4F91-9423-82DCB5DED11B    115 283 2014-11-20 17:22:13.424 0   0   0   0   0   1

我正在尝试根据基于 Web 的应用程序的 DATE 值 (DateTime) 从视图中获取最新的行,我只想在视图中显示最近的(最后)行。我尝试了很多东西,这是最新的,我尝试过的所有东西都给了我所有的行。甚至可以按时间将查询限制为最后插入的行(或者更复杂,查找执行时小于 60 秒的任何时间戳)。

SELECT 
    CounterValue , MachineName, ObjectName, CounterName,[Date]
FROM 
    [dbo].[PerfView] A
WHERE 
    ObjectName = 'Network Interface' 
    AND CounterName = 'Bytes Total/sec' 
    AND CounterValue <> 0 
    AND MachineName = '\\******** 
    AND [Date] = (SELECT MAX([Date]) 
                  FROM [dbo].[PerfView] B 
                  WHERE a.CounterValue = b.CounterValue)

【问题讨论】:

  • select top 1 ... order by [date] desc

标签: sql sql-server sql-server-2008 datetime


【解决方案1】:

这将为您提供最新记录:

SELECT top 1 CounterValue , MachineName, ObjectName, CounterName,[Date]
 FROM [dbo].[PerfView] A
 Where ObjectName = 'Network Interface' 
 and CounterName = 'Bytes Total/sec' 
 and CounterValue <>0 
 and MachineName = '\\******** 
order by [date] desc

如果你想要最后 60 秒的记录,试试:

SELECT CounterValue , MachineName, ObjectName, CounterName,[Date]
 FROM [dbo].[PerfView] A
 Where ObjectName = 'Network Interface' 
 and CounterName = 'Bytes Total/sec' 
 and CounterValue <>0 
 and MachineName = '\\******** 
 and [date] between dateadd(minute, -1, getdate()) and getdate()

【讨论】:

  • 当你想出答案时正在等待:)。
  • @Rahul 感谢您的等待。 :) 接近 10K 我可以品尝到它!
  • 这很明显,我为什么要把它作为答案发布,你应该。无论如何,离得更近一点:)。
  • 我选择了@paqogomez,这是第一个解决方案。他的第二个,虽然它在结果中有一个 machinename 实例时有效,但如果结果中有多个机器名称(例如,返回 6 台机器的最后一个值)则不起作用。这是查询性能转储,并且由于向数据中心管理员解释时间服务器是什么的复杂性(例如向 2 岁的孩子解释火箭科学),不幸的是,我能够让所有服务器同步到同一时间.因此,如果我想要 6 台机器的最后一个值,如果我使用“last minute”,我只会得到其中的 3 个。
【解决方案2】:

@tpcolson,

可能有很多方法可以做到这一点。 一种方法是@paqogomez 所建议的。这会给你你正在寻找的东西。 另一种方法是使用行数。 设置 RowCount 1,然后在没有 top 1 的情况下运行查询。它也会给你同样的结果。

如果您使用的是 sql server 2012,则另一种方法适用。有一个 offset fetch 子句。 按用途订购后:

offset 0 rows fetch next 1 rows only

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2012-04-15
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多