PostgreSQL 창으로 기능 제한
-
22-12-2019 - |
문제
쿼리 아래에 그룹에서 결과 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_value
고 rank()
는 가장 좋은 방법에 대해 이동하다.그러나 나의 투쟁은 내가 확실하지 않는 현재 쿼리를 수정해야 합니다 이를 구현하기 위해.
어떤 통찰력을 감사하겠습니다.
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 y
고 z
수 융.마찬가지로 first
고 x
수 융.
하지만 그것은 명확하는 방법입니다.
검증되지 않은,때문에 우리는 없 테스트 데이터입니다.
제휴하지 않습니다 StackOverflow