c# - SQL Server 2008 从大于给定日期时间的返回值中选择最小值

标签 c# asp.net sql sql-server

我有这个

WITH sequenced_records AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [DateTime] DESC) AS sequence_id, *
    FROM StreamView
    WHERE TypeOf = @TypeOf
    AND [DateTime] >= @DateTime
)
SELECT * FROM sequenced_records WHERE sequence_id = 1;

这对于获取最新记录非常有效。但是,如果它没有找到任何东西怎么办?我怎样才能让它返回倒退的最新记录?这意味着如果没有比给定的 DateTime 更新的项目,它会倒退并获取它找到的第一个项目。

谢谢

最佳答案

几个选项:

1) 如果@@RowCount = 0 执行单独的选择。

2) 选择一个本地表,然后如果它不包含任何行,则使用您的新查询选择它,然后从该表中选择以将数据返回给调用者。

并且单独的选择可能是(没有测试过这个并且不熟悉语句,但无论如何这里都是):

WITH sequenced_records_one AS (
    SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY [DateTime] DESC) AS sequence_id, *
    FROM StreamView
    WHERE TypeOf = @TypeOf
)
SELECT * FROM sequenced_records_one WHERE sequence_id = 1;

经过进一步审查,除非你大大简化了这个查询,否则你做的工作太多了:

SELECT TOP 1
       * 
  FROM StreamView
 WHERE TypeOf = @TypeOf
   AND [DateTime] >= @DateTime
ORDER BY [DateTime] DESC

IF @@RowCount = 0
  BEGIN
      /* Get the first record created today */
    SELECT TOP 1
           *
      FROM StreamView
     WHERE TypeOf = @TypeOf
       AND [DateTime] >= CONVERT(DATE, GETDATE())
  ORDER BY [DateTime] ASC
  END

关于c# - SQL Server 2008 从大于给定日期时间的返回值中选择最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8696848/

相关文章:

c# - 从 StreamReader.ReadLine() 获取的字符串的编码是什么

c# - 如何使用自定义命名空间创建 SyndicationFeed

asp.net - 从 ASP.NET Web API 中删除帮助页面

c# - GridView RowDataBound 不会在回发时触发

mysql - MySQL中IFNULL在大型数据集上的性能

C# VS2010 在应用程序中判断是否被调试

asp.net - 使用 FileUpload 上传到 Windows Azure

sql - 如何在 SQL 中过滤每个 id 仅具有初始行的行?

sql - 执行此操作之前,请在数据库中创建主 key 或在 session 中打开主 key

c# - 合并两个 IObservable 时的意外行为