Упростить запрос в базе данных H2 - альтернатива TOP X PERCENT - PullRequest
2 голосов
/ 16 сентября 2011

У меня проблемы с производительностью запроса, и мне было интересно, как его упростить.

У меня есть таблица "Оценки" (Образец, Категория, Жюри, Значение) и я создал несколько пользовательских функций, чтобы получить некоторые из них.средние значения для каждой выборки, поэтому у меня есть это представление:

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 записями требуется некоторое время для получения результатов.Может ли кто-нибудь сказать мне более эффективный способ построения этого запроса?

Спасибо и всего наилучшего!

...