문제

쿼리 아래에 그룹에서 결과 first 4 가지 동일한 간격의 날짜통 및 골재에 대한 평균 the_value 에서 각 bin.

WITH first as(
SELECT
    extract(EPOCH FROM foo.t_date) as the_date,
    foo_val as the_value
FROM bar
INNER JOIN foo
ON
    foo.user_id = bar.x_id
    and
    foo.user_name = 'xxxx'
)
SELECT bin, round(sum(bin_sum) OVER w /sum(bin_ct) OVER w, 2) AS running_avg
FROM  (
   SELECT width_bucket(first.the_date
                     , x.min_epoch, x.max_epoch, x.bins) AS bin
        , sum(first.the_value) AS bin_sum
        , count(*)   AS bin_ct
   FROM   first
       , (SELECT MIN(first.the_date) AS min_epoch
               , MAX(first.the_date) AS max_epoch
               , 4 AS bins
          FROM  first
         ) x
   GROUP  BY 1
   ) sub
WINDOW w AS (ORDER BY bin)
ORDER  BY 1;

나는 할 수만 계산에 대한 평균 가장 낮은 말 20 the_value's 에서 각 bin.에서 다른 여기 게시물에서 유래는 내가 이것이 가능한 아마도 ORDER BY the_valuerank() 는 가장 좋은 방법에 대해 이동하다.그러나 나의 투쟁은 내가 확실하지 않는 현재 쿼리를 수정해야 합니다 이를 구현하기 위해.

어떤 통찰력을 감사하겠습니다.

Postgres 버전 9.3

도움이 되었습니까?

해결책

row_number() 에 각 bin.
첫째로 계산한 행 번호 rn, 적용 WHERE rn < 21 에서 다음 단계:

WITH first AS (
   SELECT extract(EPOCH FROM foo.t_date) AS the_date
        , foo_val AS the_value
   FROM bar
   JOIN foo ON foo.user_id = bar.x_id
           AND foo.user_name = 'xxxx'
   )
, x AS (
   SELECT MIN(the_date) AS min_epoch
        , MAX(the_date) AS max_epoch
   FROM  first
   )
, y AS (
   SELECT width_bucket(f.the_date, x.min_epoch, x.max_epoch, 4) AS bin, *
   FROM   first f, x
   )
, z AS (
   SELECT row_number() OVER (PARTITION BY bin ORDER BY the_value) AS rn, *
   FROM   y
   )
SELECT bin, round(sum(bin_sum) OVER w / sum(bin_ct) OVER w, 2) AS running_avg
FROM  (
   SELECT bin
        , sum(the_value) AS bin_sum
        , count(*)       AS bin_ct
   FROM   z
   WHERE  rn < 21   -- max 20 lowest values
   GROUP  BY 1
   ) sub
WINDOW w AS (ORDER BY bin)
ORDER  BY 1;

Cte yz 수 융.마찬가지로 firstx 수 융.
하지만 그것은 명확하는 방법입니다.

검증되지 않은,때문에 우리는 없 테스트 데이터입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top