У меня проблемы с производительностью запроса, и мне было интересно, как его упростить.
У меня есть таблица "Оценки" (Образец, Категория, Жюри, Значение) и я создал несколько пользовательских функций, чтобы получить некоторые из них.средние значения для каждой выборки, поэтому у меня есть это представление:
CREATE VIEW Results AS
SELECT Sample,
Category,
IFNULL(COUNT_VALID(Value),0) || ' / ' || COUNT(Value) AS Valid,
CUSTOM_MEAN(Value) AS Mean,
CUSTOM_MEDIAN(Value) AS Median
FROM Evaluations GROUP BY Sample, Category;
Затем я хочу иметь другое поле, сообщающее мне, находится ли каждая выборка в пределах 30% лучших оцененных выборок в своей категории.Было бы идеально использовать TOP (X) PERCENT, но, похоже, H2 не поддерживает его, поэтому я сделал второе представление, которое вычисляет позицию в категории, умноженную на 100, разделенную на общее количество в категории и по сравнению с 30:
CREATE VIEW Res AS
SELECT R1.*,
CASE
WHEN (
((SELECT COUNT(*) FROM Results R2
WHERE R2.Category = R1.Category
AND (R2.Mean > R1.Mean OR (R2.Mean = R1.Mean AND R2.Median > R1.Median))) + 1) * 100
/
(SELECT COUNT(*) FROM Results R2 WHERE R2.Category = R1.Category) )
> 30
THEN 'over 30%'
ELSE 'within 30%'
END as 30PERCENT
FROM Results R1 ORDER BY Mean DESC, Median DESC;
Это работает правильно, но только с 500 записями требуется некоторое время для получения результатов.Может ли кто-нибудь сказать мне более эффективный способ построения этого запроса?
Спасибо и всего наилучшего!