[英]Find preceding and succeeding values for a time range in Sql Server for multiple ids
各位程序员好,
我有一个 sql 查询,我在其中获取特定范围内的数据,该范围由from , to和单个测量的标识符id定义。 除了范围内的值之外,我还获取该范围之前的 10 个元素和该范围之后的 10 个元素。
我通过在清单 [1] 中部署查询并在MEASUREMENT_ID和VALUEDATE上使用我的聚集索引来做到这一点。
这对于获取单个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.