2014-07-23 29 views
0

所以672是在一個星期季度的量,我需要在同一天5周各方面的平均(值),在同一季度如何重寫這個SQL查詢無或「S

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

改用'in'。 –

+1

類似'(a.QuarterNumber - 510176)%672 = 0'? – njzk2

回答

1

我不知道哪個是你想要的最後一個數字。但校長會找到你想要的人數。在你的例子中,我將假設5爲最大乘數。

所以知道firt季度是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。

+0

thx all,great stuff –

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 
+0

mod是模數的oracle方式。對於sqlite,postgre,mysql,您將使用'%' – njzk2

1

除了Gordon建議的內容,您還可以通過加入來表達這一點。我在這裏使用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)