我有以下三个简单的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的有效数据获取方法吗?
如您所愿,没有UNION。
MySQL(已 测试 )
SELECT dv1.timestamp, dv1.values FROM myTable AS dv1 WHERE dv1.timestamp BETWEEN ( SELECT dv2.timestamp FROM myTable AS dv2 WHERE dv2.timestamp < '@START_DATE' ORDER BY dv2.timestamp DESC LIMIT 1 ) AND ( SELECT dv3.timestamp FROM myTable AS dv3 WHERE dv3.timestamp > '@END_DATE' ORDER BY dv3.timestamp ASC LIMIT 1 )
编辑 抱歉,我忘了注意到T-SQL。
T-SQL(未 测试 )
SELECT dv1.timestamp, dv1.values FROM myTable AS dv1 WHERE dv1.timestamp BETWEEN ( SELECT TOP 1 dv2.timestamp FROM myTable AS dv2 WHERE dv2.timestamp > @START_DATE ORDER BY dv2.timestamp DESC ) AND ( SELECT TOP 1 dv3.timestamp FROM myTable AS dv3 WHERE dv3.timestamp < @END_DATE ORDER BY dv3.timestamp ASC )
注意 如果结果不正确,则可以只交换子查询(即运算符和ASC / DESC)。
跳出思维限制 :)