我有这个
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/