我在使用累积聚合的Firebird(嵌入式-版本3.0)数据库时遇到问题。我有下表:
+----+---------+
|ID |Salary +
+----+---------+
|1 |10.00 |
+----+---------+
|2 |20.00 |
+----+---------+
|3 |35.00 |
+----+---------+
|4 |10.00 |
+----+---------+
我想添加第三列(cum_sum),其中将包含一个累加的总和,即。:
+----+---------+---------+
|ID +Salary +cum_sum |
+----+---------+---------+
|1 |10.00 |10.00 |
+----+---------+---------+
|2 |20.00 |30.00 |
+----+---------+---------+
|3 |35.00 |65.00 |
+----+---------+---------+
|4 |10.00 |75.00 |
+----+---------+---------+
当我尝试使用以下代码时:
select id, salary, sum(salary) over (order by salary) cum_sum
from employee
order by salary
我收到一条消息:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 37.
问题出在哪里?
答案 0 :(得分:1)
如果使用Firebird 2.5或更早版本,则会出现此错误。窗口函数为introduced in Firebird 3。如果要按照问题所示运行查询,则需要升级到Firebird 3。
在您声称要使用Firebird 3 Embedded时,建议您仔细检查
如果您的Firebird嵌入式版本实际上是版本3(例如,使用select rdb$get_context('SYSTEM', 'ENGINE_VERSION') from rdb$database
;此版本适用于Firebird 2.1及更高版本,并且将报告较早版本的错误)。
您可能已加载了其他版本的Firebird。如果您在搜索路径上的早期版本具有嵌入式库的其他版本,则可能会发生这种情况。如果您在同一位置具有Firebird 2.5 fbembed.dll和Firebird 3 fbclient.dll,也会发生这种情况。在Firebird 3中,嵌入式与普通客户端统一,并且不再具有单独的库(它需要 additional 库,而不是引擎插件)。但是,大多数Firebird驱动程序会先尝试加载fbembed.dll,然后再回到fbclient.dll。
如果您实际上是使用嵌入式Firebird连接的,而不是偶然连接到其他版本的Firebird服务器实例(例如select rdb$get_context('SYSTEM', 'NETWORK_PROTOCOL') from rdb$database
将报告NULL
表示嵌入式,而其他连接的值方法)。
如果您使用错误的连接字符串或错误地配置了驱动程序,则会发生这种情况。
否则,如果您无法升级,则将需要使用更痛苦的选项来编写为您执行此操作的存储过程(或块),或者诉诸同样痛苦的基于CTE的递归解决方案(具有其他限制)。