SQL Server 2008从返回值中选择Min值大于给定的DateTime

use*_*620 2 c# sql sql-server asp.net

我有这个

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;
Run Code Online (Sandbox Code Playgroud)

哪个可以获得最新记录.但如果找不到什么呢?我怎样才能让它返回倒退的最新记录?意味着如果没有比给定DateTime更新的项目,它将反向返回并获取它找到的第一个项目.

谢谢

com*_*ech 5

有两种选择:

1)If @@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;
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)