2

我想做这样的事情:

CNT=2;

//[edit]
select avg(price) from (
  select first :CNT p.Price
  from Price p
  order by p.Date desc
);

这不起作用,Firebird 不允许:cnt作为 FIRST 的参数。我需要平均第一个 CNT 最新价格。数字 2 发生变化,因此不能硬编码。

这可以分解为 FOR SELECT 循环并在达到计数时中断。这是最好的方法吗?这可以在单个 SQL 语句中完成吗?

将 SQL 创建为字符串并运行它也不是最合适的。数据库编译我的 SQL 语句很重要。

4

2 回答 2

3

您不必使用CTE,您可以直接使用:

select avg(price) from (
  select first :cnt p.Price
  from Price p
  order by p.Date desc
);
于 2013-06-24T04:43:36.050 回答
1

您可以使用 CTE(通用表表达式)(请参阅http://www.firebirdsql.org/refdocs/langrefupd21-select.html#langrefupd21-select-cte)在计算平均值之前选择数据。请参见下面的示例:

with query1 as (
  select first 2 p.Price
  from Price p
  order by p.Date desc
)

select avg(price) from query1
于 2013-06-24T03:11:14.213 回答