我有一个表“l20”,其中包含1到20个值“hdif”,按升序排序。我需要根据表“l20”中的值的数量,将这些值中的前1到10个提取到表“t10”中。我使用的是windows10,libreoffice6.4.4,firebird3数据库。我试过case语句和decode语句来计算“l20”中的行数,但似乎两者都不起作用。
如果我在表“l20”中为select输入一个数字,那么它工作正常。有人知道怎么解决吗?此查询的目的是计算一个高尔夫障碍,该障碍使用最近20场比赛中最好(最低)的10分。以下是编码:
/* Qry_Index_Calc - calculates handicap index from top 10 differentials of last 20 games */
/* Source is "VW_Plyr_Diff" which has handicap differentials already calculated. */
SELECT (AVG ("T10"."HDIF") * .96) "Index", (Count ("T10"."HDIF")) FROM
/* Get only the games needed if less than 20 games have been played. */
(
SELECT FIRST
DECODE ((SELECT COUNT (*) FROM "L20"),
1, 1
, 2, 1
, 3, 1
, 4, 1
, 5, 1
, 6, 1
, 7, 2
, 8, 2
, 9, 3
, 10, 3
, 11, 4
, 12, 4
, 13, 5
, 14, 5
, 15, 6
, 16, 6
, 17, 7
, 18, 8
, 19, 9
, 10)
"L20"."HDIF"
FROM
/* Get up to 20 of the most recent (last) games played. */
( SELECT FIRST 20 "PlayerID" "PID", "GID" "GID",
RANK ( ) OVER ( PARTITION BY "PlayerID" ORDER BY "Diff" ) "Rnk",
"Diff" "HDIF", "Date" "Gdate"
FROM "Vw_Plyr_Diff"
WHERE "PlayerID" = 1)
"L20"
) "T10"
1条答案
按热度按时间cyvaqqii1#
您需要在中的表达式周围加括号
FIRST
. 如firebird 3.0语言参考中所述FIRST
,SKIP
:所以,使用
在中直接使用子查询时
first
,您需要使用双圆括号(一次用于表达式,一次用于表达式中的子查询被括在括号中的事实。sql标准
OFFSET
/FETCH
firebird3中引入的子句不支持表达式。注意,您当前的代码没有指定
ORDER BY
,这意味着返回哪些行是未定义的,这将取决于数据库中数据的位置、访问计划等。我建议您添加适当的ORDER BY
子句以确保返回的行符合预期。看起来你想
SELECT
从派生表L20
定义在FROM
子句,而不是来自实际表L20
. 如果你想做到这一点L20
大多数都可以指定为公共表表达式。