如何在SQL中获取ROW_NUMBER()?

时间:2016-04-20 03:53:02

标签: sql firebird

我尝试使用ROW_NUMBER()获取行号,但它显示以下错误:

  

无法格式化消息13:896 - 消息文件C:\ WINDOWS \ firebird.msg   未找到。动态SQL错误。 SQL错误代码= -104。令牌未知 -   第2行,第66栏。

这是我的代码:

SELECT  avg(CSIDTL.RATING) ,SVD.SVCADVISORNAME, ROW_NUMBER() OVER(ORDER BY avg(CSIDTL.RATING) )
        FROM T_APPT_BOOKING_MSTR MSTR ,T_APPT_CSI_SURVEY CSI,T_APPT_CSI_SURVEY_DTL CSIDTL,
        T_SVC_SVCADVISOR_MASTER SVD
        WHERE MSTR.APPTBKID = CSI.APPTBKID
        AND CSI.CSI_SURVERYID = CSIDTL.CSI_SURVERYID
        AND SVD.SVCADVISORID = MSTR.SVCADVISORID
        AND CSI.FEEDBACK_STATUS = 'Y'
        AND CSIDTL.question ='Service Advisor'
        GROUP BY SVD.SVCADVISORNAME
        ORDER by avg(CSIDTL.RATING)

3 个答案:

答案 0 :(得分:8)

Firebird 3.0引入了ROW_NUMBER()功能,仅在几天前发布。有关确切的语法,请参阅发行说明,第Window (Analytical) Functions章。您收到的错误表明您使用的是较旧版本的Firebird,但没有此功能。

答案 1 :(得分:1)

我在Firebird 2.5中使用它

参考:http://www.firebirdfaq.org/faq343/

SELECT rdb$get_context('USER_TRANSACTION', 'row#') as row_number, DUMMY, A.*
FROM your_table A
CROSS JOIN
(SELECT rdb$set_context('USER_TRANSACTION', 'row#',
COALESCE(CAST(rdb$get_context('USER_TRANSACTION', 'row#') AS INTEGER), 0) + 1) AS dummy
FROM rdb$database) dummy

答案 2 :(得分:0)

Firebird 2.5中的其他替代方法是使用发电机

CREATE GENERATOR tmp$rn;
UPDATE my_table t SET t.id_field = (SELECT FIRST 1 NEXT VALUE FOR tmp$rn AS "row_number"
FROM my_table ORDER BY another_field1 DESC, another_field2 DESC);
DROP GENERATOR tmp$rn;