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 回答