小编典典

SQL查询记录在一定范围内,最大/最小超出范围

sql

我有以下三个简单的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的有效数据获取方法吗?


阅读 222

收藏
2021-04-28

共1个答案

小编典典

如您所愿,没有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)。

跳出思维限制 :)

2021-04-28