olegbank
Дата: 03.05.2012 01:31:20
вопрос по стандартному SQL,но поскольку испытывать буду в Файрберде,пишу сюда
Есть таблица с тремя числовыми полями - p1,p2,angle. делаю группировку по p1,p2, получаю min(angle) ,avg(angle), max(angle).
вопрос такой -как средствами SQL узнать, в каком отношении являются количество попаданий в интервале +- 20% от среднего для данного p1,p2 , ко всем значениям для данного p1,p2 ,то есть от максимального для минимального? число можно от 0 до 1,или в процентах.можно сделать на уровне Delphi кода, или подзапрос, но ,может, есть методы проще или удобнее?
WildSery
Дата: 03.05.2012 02:02:11
В любом случае, нужно сначала посчитать AVG, так что без двух проходов не обойтись, как мне кажется.
А дальше COUNT(CASE ...) / COUNT(*)
olegbank
Дата: 03.05.2012 02:13:32
да,асы посоветовали так.вроде похоже,только поменял на 50%.точность особая не нужна, но утром пересмотрю, такое впечатление, что left join может давать ошибку
SELECT agg.p1, agg.p2, COUNT(*),agg.cnt
FROM (
SELECT p1, p2, min(ang) AS mins, avg(ang) AS avgs, max(ang) AS maxs, COUNT(*) AS cnt FROM angle GROUP BY p1, p2
) AS agg
LEFT JOIN angle ON angle.p1 = agg.p1 AND angle.p2 = agg.p2
AND angle.ang BETWEEN (agg.avgs - (agg.avgs - agg.mins)*0.5) AND (agg.avgs + (agg.maxs - agg.avgs)*0.5)
GROUP BY agg.p1, agg.p2, agg.cnt