#jasper-reports #rank #infobright
#jasper-отчеты #ранг #infobright
Вопрос:
У меня сложный запрос, для которого требуется ранг в нем. Я узнал, что стандартный способ сделать это — использовать технику, описанную на этой странице: http://thinkdiff.net/mysql/how-to-get-rank-using-mysql-query /. Я использую Infobright в качестве серверной части, и это работает не совсем так, как ожидалось. То есть, в то время как стандартный движок MySQL отображал бы ранг как 1, 2, 3, 4 и т.д… Brighthouse (движок Infobright) вернет 1, 1, 1, 1 и т.д…. Итак, я придумал стратегию установки переменной, функции, а затем выполнения ее в запросе. Вот запрос proof of concept, который выполняет именно это:
SET @rank = 0;
DROP FUNCTION IF EXISTS __GetRank;
DELIMITER $$
CREATE FUNCTION __GetRank() RETURNS INT
BEGIN
SET @rank = @rank 1;
return @rank;
END$$
DELIMITER ;
select __GetRank() AS rank, id from accounts;
Затем я скопировал и вставил функцию в iReport отчета Jasper, а затем скомпилировал свой отчет. После его выполнения я получаю синтаксические ошибки. Поэтому я подумал, что, возможно, ; сбрасывал это. Итак, в верхней части запроса я вставил РАЗДЕЛИТЕЛЬ ;. Это тоже не сработало.
Возможно ли вообще то, что я хочу сделать? Если да, то как? И если есть простой способ получить ранг без написания функции, я бы тоже был открыт для этого.
Ответ №1:
Infobright не поддерживает функции. С сайта: http://www.infobright.org/forums/viewthread/1871/#7485
Действительно, IB поддерживает хранимые процедуры, но не поддерживает хранимые функции или пользовательские функции.
select if(@rank is null,@rank:= 0,@rank:= @rank 1) as rank, id from accounts
Не работает, потому что вы не можете писать в @vars в запросах.
Это:
SELECT
(SELECT COUNT(*)
FROM mytable t1
WHERE t1.rankedcolumn > t2.rankedcolumn) AS rank,
t2.rankedcolumn
FROM mytable t2 WHERE ...;
будет работать, но, конечно, очень медленно.
Отказ от ответственности, не мой код, а Якуба Вроблевски (основатель Infobright)
Надеюсь, это поможет…
Комментарии:
1. Спасибо за ответ, но это не совсем то, что я ищу. Это отлично работает с MySQL, но без использования движка brighthouse (Infobright). Для всех элементов в brighthouse ранг будет отображаться как 1.
2. Вы это тестировали?, потому что тогда на выходе должны быть все 0, а не 1.
3. В качестве альтернативы вы можете написать хранимую процедуру, которая выполняет запись во временную таблицу, а затем считывает временную таблицу.
4. Изменен ответ, чтобы отразить специфику infobright, почему для infobright нет тега?
5. Однако я попытался пометить его infobright; там говорилось, что у меня должно быть 1500 очков репутации, прежде чем создавать свой собственный тег. Странно, что это никогда не создавалось раньше.
Ответ №2:
Вот как я решил эту проблему. Моя серверная программа выполнила скрипт mysql. Затем я взял выходные данные и преобразовал их в CSV. Затем я использовал это в качестве входных данных для своего отчета. Немного запутанно, но это работает.