繁体   English   中英

在 Sql 服务器中查找多个 id 的时间范围的前后值

[英]Find preceding and succeeding values for a time range in Sql Server for multiple ids

各位程序员好,

我有一个 sql 查询,我在其中获取特定范围内的数据,该范围由fromto单个测量的标识符id定义。 除了范围内的值之外,我还获取该范围之前的 10 个元素和该范围之后的 10 个元素。

我通过在清单 [1] 中部署查询并在MEASUREMENT_IDVALUEDATE上使用我的聚集索引来做到这一点。

这对于获取单个measurementId的值非常有效,但是我想扩展我的方法以一次获取多个测量值,以及附加的前面和后面的元素。

谁能给我一个关于如何执行这样一个查询的提示。

此外,我对执行多项选择并将它们与UNION ALL组合不太满意,因此请随时就如何最好地安装我的查询提出任何其他建议。

国王问候。

[1]
--element pre Range...
SELECT * FROM (
    SELECT TOP 10 * FROM TB_VALUES
    WHERE MEASUREMENT_ID = @ID 
    AND VALUEDATE < @DATE_FROM
    ORDER BY MEASUREMENT_ID, VALUEDATE DESC
) as pre 

UNION ALL

SELECT * FROM (
    SELECT * FROM TB_VALUES
    WHERE MEASUREMENT_ID = @ID 
    AND VALUEDATE >= @DATE_FROM
    AND VALUEDATE < @DATE_TO
) as main 

UNION ALL

--element post Range...
SELECT * FROM (
    SELECT TOP 10 * FROM TB_VALUES
    WHERE MEASUREMENT_ID = @ID 
    AND VALUEDATE >= @DATE_TO
    ORDER BY MEASUREMENT_ID, VALUEDATE
) as post 

ORDER BY MEASUREMENT_ID, VALUEDATE

使用当前查询的最简单方法是包含按 Id 分区的 row_number() ,并且只有 select 是每个 Id 的前 10 名。

select  *
from    (   select  *
                    , row_number() over (partition by MEASUREMENT_ID order by VALUEDATE desc) as rn
            from    TB_VALUES
            where   VALUEDATE < @DATE_FROM) as pre
where   rn <= 10

除了 order by valuedate asc 之外,也对后续查询执行此操作。 并删除您的 ID 过滤器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM