【发布时间】:2011-06-10 20:10:01
【问题描述】:
我有以下三个简单的 T-SQL 查询。第一个是获取一定范围内的记录(DATETIME类型):
SELECT value, timestamp
FROM myTable
WHERE timestamp BETWEEN @startDT AND @endDT
第二个是获取最接近@startDT(DATETIME类型)的记录
SELECT TOP 1
value, timestamp
FROM myTable
WHERE timestamp > @startDT
ORDER BY timestamp DESC
最后一个是获取@endDT之后最接近的记录:
SELECT TOP 1
value, timestamp
FROM myTable
WHERE timestamp < @endDT
ORDER BY timestamp ASC
我想将以上三个查询的所有记录作为一组记录。我尝试使用 UNION,但似乎 UNION 中的子查询不允许使用 ORDER BY 子句。有没有有效的方法来获得我的结果?
. . * | * * * * * | * . . .
start end
上图只是将*s的记录显示为我需要的记录,而|...|是边界。
顺便说一句,myTable 中的数据量很大。我的理解 UNION 不是从 UNION 获取数据的有效方法。没有 UNION 获取数据的任何有效方法?
【问题讨论】:
-
您确定通过
ORDER BY value, timestamp从这些查询中得到想要的结果吗?根据您的描述,我认为您只想按时间戳订购。否则,您将获得最接近边界的最小值。 -
你说得对,我只用时间戳改了。
-
很高兴看到这么多答案来满足我的需求。 @Piotr Auguscik 提到 min/max 在性能方面优于 Order + top 1。是对的吗?根据答案,我想出了一个“最小/最大+分组依据”的解决方案。不确定哪个更好。请记住,在我的案例中,myTable 包含大量记录。