2014-11-19 2 views
2

임의의 크기의 대표 데이터 샘플을 리턴하는 조회를 작성하려고합니다. n th 행을 선택하면됩니다. 여기서 n은 전체 결과 집합이 가능한 한 근접한 임의의 크기가되도록합니다.행을 균등하게 건너 뛴 고정 된 행 수를 선택하십시오.

결과 집합이 일반적으로 임의의 크기보다 작은 경우이 기능을 사용하고 싶습니다. 이 경우 전체 결과 집합이 반환되어야합니다.

나는 행을 선택하는 방법을 보여주는 this question을 찾았습니다.

이 다음과 같은 오류가 발생
SELECT * FROM (
    SELECT *, ((row_number() OVER (ORDER BY "time")) 
       % ceil(count(*)::FLOAT/500::FLOAT)::BIGINT) AS rn 
    FROM data_raw) sa 
WHERE sa.rn=0; 

:

ERROR: column "data_raw.serial" must appear in the GROUP BY clause or be used in an aggregate function Position: 23


이 같은 n에 대한 계산을 제거 작동 : 여기


는 내가 지금까지 무엇을 가지고

SELECT * FROM (
    SELECT *, (row_number() OVER (ORDER BY "time")) 
       % 50 AS rn FROM data_raw) sa 
LIMIT 500; 


나는 또한 WHERE 절에 계산을 이동하려고 :

SELECT * FROM (
    SELECT *, (row_number() OVER (ORDER BY "time")) AS rn 
    FROM data_raw) sa 
WHERE (sa.rn % ceil(count(*)::FLOAT/500::FLOAT)::BIGINT)=0; 

그 오류가 너무 결과 :

ERROR: aggregate functions are not allowed in WHERE Position: 108


사람 중 하나 어떻게 내 쿼리를 해결하는에 어떤 아이디어가 있습니까 또는 이렇게하는 더 좋은 방법?

나는 또한 임의의 숫자와 확률을 사용하여 행을 선택하는 것에 대해 생각해 봤지만, 나는 응집의 가능성이없는 결정 론적으로 뭔가를하고 싶습니다.

+0

BTW, pg 9.4? 베타 - 릴리스를 사용하고 있습니까? –

+0

예, 9.4를 사용하고 있습니다. – Ian

답변

1

첫 번째 시도에서 실수는 집합 함수 count(*)집계되지 않은 행 선택을 혼용 할 수 없다는 것입니다. 대신 윈도우 집계 함수로 count() 사용하여이 문제를 해결할 수 있습니다 : 여기

SELECT * FROM (
    SELECT *, ((row_number() OVER (ORDER BY "time")) 
       % ceil(count(*) OVER()/500.0)::int) AS rn 
    FROM data_raw 
    ) sub 
WHERE sub.rn = 0;

상세 설명 :

@Alexander이 당신의 마지막 시도에 대한 수정 프로그램이 있습니다.

1

당신은 그 계산을 하위 쿼리해야한다 :

WHERE rn % (SELECT CEIL(COUNT(*)::FLOAT/500:FLOAT)::BIGINT FROM data_raw) = 0 

이 방법은 더 이상 집계 함수로 간주됩니다,하지만 스칼라 쿼리와.