所以672是一周的季度数,我需要同一季度同一天的5周所有季度的平均值(/ p)
select value, DATEADD(MINUTE, a.QuarterNumber * 15, '2000-01-01') AS [Timestamp]
from measurements.Archive a
INNER JOIN measurements.Points p ON a.PointId = p.Id
INNER JOIN fifthcore..cm_lod_devices ld ON ld.Uuid = p.LogicalDeviceUuid
WHERE ld.Id IN (SELECT Value FROM @LodDeviceIds)
AND (
a.QuarterNumber = 510176
OR a.QuarterNumber = 510176 - 672
OR a.QuarterNumber = 510176 - (672*2)
OR a.QuarterNumber = 510176 - (672*3)
OR a.QuarterNumber = 510176 - (672*4)
OR a.QuarterNumber = 510176 - (672*5)
...
)
答案 0 :(得分:1)
改为使用in
:
where a.QuarterNumber in (510176, 510176 - 672, 510176 - (672*2), 510176 - (672*3), 510176 - (672*4)
510176 - (672*5), . . .)
如果存在某种编码方案,并且您基本上想要无限列表,那么使用模运算。在许多数据库中,这将起作用:
where mod(a.QuarterNumber, 672) = mod(510176, 672) and a.QuarterNumber <= 510176
答案 1 :(得分:1)
我不知道你想要的最后一个号码是哪一个。但校长会找到你想要的人数。在您的示例中,我将假设5为最大乘数。
所以知道510176
ani的第一个季度会找到你的例子510176 - (672*5)
中的最小值,我会用672来测试除法的整数部分:
select value, DATEADD(MINUTE, a.QuarterNumber * 15, '2000-01-01') AS [Timestamp]
from measurements.Archive a
INNER JOIN measurements.Points p ON a.PointId = p.Id
INNER JOIN fifthcore..cm_lod_devices ld ON ld.Uuid = p.LogicalDeviceUuid
WHERE ld.Id IN (SELECT Value FROM @LodDeviceIds)
AND ((510176 - (672*5))- a.QuarterNumber)%672 = 0
AND a.QuarterNumber>510176 - (672*5)
AND a.QuarterNumber<=510176
在上面你只需要将5
更改为你预期的宿舍数-1。
答案 2 :(得分:1)
除了戈登提出的建议,您还可以通过加入来表达这一点。我在这里使用CTE:
with t(n) as ( values 0 union all select n+1 from t where n<? )
select value, DATEADD(MINUTE, a.QuarterNumber * 15, '2000-01-01') AS [Timestamp]
from measurements.Archive a
INNER JOIN measurements.Points p ON a.PointId = p.Id
INNER JOIN fifthcore..cm_lod_devices ld ON ld.Uuid = p.LogicalDeviceUuid
JOIN t ON a.QuarterNumber = 510176 - (672*t.n)
WHERE ld.Id IN (SELECT Value FROM @LodDeviceIds)