2013-06-23 4 views
2

나는 같은 것을 할 싶습니다 :Firebird에서 처음 N 개의 행을 집계하는 방법은 무엇입니까?

CNT=2; 

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

이 작동하지 않는, 파이어 버드는 FIRST에 매개 변수로 :cnt을 허용하지 않습니다. 첫 번째 CNT 최신 가격을 평균해야합니다. 숫자 2는 변경되므로 하드 코드 할 수 없습니다.

이것은 FOR SELECT 루프로 분류 할 수 있으며 카운트에 도달하면 중단 될 수 있습니다. 그게 최선의 방법일까요? 단일 SQL 문에서이 작업을 수행 할 수 있습니까?

SQL을 문자열로 생성하고 실행하는 것이 적합하지 않습니다. 데이터베이스가 내 SQL 문을 컴파일하는 것이 중요합니다.

답변

3

: 아래의 예를 참조하십시오

select avg(price) from (
    select first :cnt p.Price 
    from Price p 
    order by p.Date desc 
); 
+0

파이어 버드는 이것을 "토큰 알 수 없음"으로 거부하고 변수 cnt 앞에':'를 가리킨다. 즉, 'FIRST'에 대한 매개 변수로 변수를 허용하지 않습니다. – jcalfee314

+0

예제가 더 좋으므로 질문을 업데이트했습니다 ... – jcalfee314

+0

': variable'은 분명히 PSQL에서만 작동합니다. 그렇지 않으면 변수를 정의 할 수 없습니다. 또는 공급자를 기반으로 매개 변수를 사용할 수 있습니다. 나는. .NET에서'select first @cnt ... '라고 쓰고'FbCommand'에 매개 변수를 정의 할 수 있습니다. –

1

평균을 계산하기 전에 CTE (공통 표 식) (http://www.firebirdsql.org/refdocs/langrefupd21-select.html#langrefupd21-select-cte 참조)를 사용하여 데이터를 선택할 수 있습니다. 당신이 직접 할 수 있습니다, 당신은 CTE를 사용할 필요가 없습니다

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

select avg(price) from query1 
+0

좋은 시도, 정말하지만 .. 너무 열팽창 계수를 즐기고 사실, 당신 하드 코딩 된 2. 나는 2를 모른다. 그것은 변수입니다. – jcalfee314