如何在没有or或#的情况下重写此SQL Query

时间:2014-07-23 13:49:19

标签: sql

所以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)
...
) 

3 个答案:

答案 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)
相关问题