2012-03-20 4 views
2

쿼리를 상위 n 개의 창으로 제한하는 쉬운 방법이 있는지 궁금합니다.PostgreSQL LIMIT over WINDOW

즉, 내가 위의 쿼리 (의미가) 상위 100 개의 레코드가 아닌 100 창

내가 싶어하는 상위 100 SUM2입니다 반환 뭔가

SELECT field1 
     ,field2 
     ,field3 
     ,sum(field2) over (partition by field1) sum2 
     ,sum(field3) over (partition by field1) sum3 
FROM table1 
GROUP BY field1, field2, field3 
ORDER BY sum2 DESC LIMIT 100 

처럼이 있다고 비록 그 창 안에 여러 행이있을지라도. 그래서 나는 400 개의 레코드를 얻을 수 있지만 상위 100 개의 창만 가져올 수 있습니다.

희망적으로는 의미가 있습니다.

+0

왜 열별로 그룹화하지 않습니까? – Teja

+0

남아 있으려면 각 레코드에 세부 사항이 필요합니다. 동일한 결과 집합에서 세부 정보와 집계를 가져 오려고합니다. 실제 쿼리는 훨씬 더 큽니다. 이것은 단지 질문의 샘플이었습니다. –

+0

아직도 못 ..하지만 먼저 열을 기준으로 그룹화해야합니다 ... – Teja

답변

1

의견을 보내고 더 생각해 보면 다음 쿼리가 사용자가 원하는 것을 수행한다고 생각합니다.

나는 쿼리 결과 첫 번째 100 "windows"를 선택하고 해당 창에 속하는 모든 행을 반환합니다. 창문은 field1에 의해 분할되므로 실제로는 field1의 100 개의 고유 값이 최대 인 sum2입니다. 넥타이가 sum2 인 경우 내 쿼리에서 field1이 더 커졌습니다 (사용자가 지정하지 않았습니다).

WITH x AS (
    SELECT field1 
      ,field2 
      ,field3 
      ,sum(field2) over w sum2 
      ,sum(field3) over w sum3 
    FROM table1 
    GROUP BY field1, field2, field3 
    WINDOW w AS (PARTITION BY field1) 
    ) 
    , y AS (
    SELECT field1 
    FROM x 
    GROUP BY sum2, field1 
    ORDER BY sum2 DESC, field1 DESC 
    LIMIT 100 
    ) 
SELECT x.* 
FROM y 
JOIN x USING (field1) 
ORDER BY sum2 DESC, field1 DESC, field2 DESC, field3 DESC; 

결정적인 포인트가 또 다른 CTE에 그 중 100 개 경력이있는 창을 선택하는 CTE의 집계 값을 생성하는 것입니다 (또한 DISTINCT와 함께 할 수있다, 나는 GROUP BY/ORDER BY을 선택) 및 가입 결과를 첫 번째 CTE로 반환하여 해당 창에 대한 모든 행을 가져옵니다.

이 모든 것은 상당히 복잡한 쿼리입니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 나는 상관없이 100 개의 행을 얻는 것처럼 보인다. 나는 내가 분명히 한 것을 설명했다고 생각하지 않는다. 내가 찾고 있던 것은 그룹 내의 각 레코드뿐이었습니다. 그래서 나는 그 창 안의 각 레코드와 함께 상위 100 개의 창을 얻을 것입니다. 따라서 각 창에 5 개의 레코드가 있고 상위 100 개의 창을 원하면 총 500 개의 레코드로 끝납니다. –

+0

@PhilFreeman : 효과적으로 (field2, field3)의 모든 조합에 대해 행이있는 'field1'에 대해 100 개의 별개 값을 원하십니까? 그리고 당신은 정말로 GROUP BY field1, field2, field3'을 원해서 그 이전에 중복을 없애려고합니다 - 그래서 중복은 합계에 추가되지 않습니까? 의사 소통과 같은 복잡한 경우에는 샘플 값과 기대되는 샘플 출력을 통해 의사 소통이 더 쉬울 것입니다. –

+0

@PhilFreeman : 다시 시도해 봤습니다. –