0

ランクを必要とする複雑なクエリがあります。これを行う標準的な方法は、このページhttp://thinkdiff.net/mysql/how-to-get-rank-using-mysql-query/にある手法を使用することであることがわかりました。バックエンドとして Infobright を使用していますが、期待どおりに動作しません。つまり、標準の MySQL エンジンではランクが 1、2、3、4 などと表示されますが、Brighthouse (Infobright のエンジン) は 1、1、1、1 などを返します。変数、関数を設定し、クエリで実行する戦略。まさにそれを行う概念実証クエリを次に示します。

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;

次に、関数をコピーして Jasper Report の iReport に貼り付け、レポートをコンパイルしました。実行後、構文エラーが発生します。だから私はおそらくそれを考えました; 捨てていました。そのため、クエリの先頭に DELIMITER ; を挿入しました。これもうまくいきませんでした。

私がやりたいことは可能ですか?もしそうなら、どのように?また、関数を記述せずにランクを取得する Infobright の方法があれば、それも受け入れます。

4

2 に答える 2

0

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 ...;  

動作しますが、もちろん非常に遅いです。

免責事項、私のコードではなく、Jakub Wroblewski(Infobrightの創設者)

お役に立てれば...

于 2011-04-14T15:11:35.347 に答える
0

これが私がこれを解決した方法です。サーバー側プログラムに mysql スクリプトを実行させました。次に、出力を取得して CSV に変換しました。次に、これをレポートの入力データとして使用しました。少し複雑ですが、機能します。

于 2011-04-24T21:22:20.953 に答える