Postgres에서 다른 그룹으로 그룹화 된 최대 값을 사용하여 전체 레코드를 검색하려면 어떻게해야합니까?

안젤로

다음과 같이 테이블이 있습니다 (실제로 큰 쿼리이므로 테이블에 대해 조인을 사용하지 마십시오).

date     | priority | data
20200301 | 1        | 0.3
20200301 | 2        | 0.4
20200302 | 2        | 0.4
20200302 | 3        | 0.1
20200303 | 1        | 0.8

따라서 각 날짜의 우선 순위가 가장 낮은 날짜와 데이터를 원하므로 찾고있는 쿼리의 결과는 다음과 같습니다.

date     | priority | data
20200301 | 1        | 0.3
20200302 | 2        | 0.4
20200303 | 1        | 0.8

group by 절을 만들려고 할 때마다 해당 쿼리는 데이터 열을 검색하거나 데이터 열에서 다른 값을 지원할 수 없습니다.

Marth

이를 위해 row_number창 기능을 사용할 수 있습니다 .

CREATE TABLE t (
    "date"     INTEGER,
    "priority" INTEGER,
    "data"     FLOAT
);

INSERT INTO t
    ("date", "priority", "data")
VALUES ('20200301', '1', '0.3')
     , ('20200301', '2', '0.4')
     , ('20200302', '2', '0.4')
     , ('20200302', '3', '0.1')
     , ('20200303', '1', '0.8');


SELECT *
FROM (
    SELECT *, row_number() OVER (PARTITION BY date ORDER BY priority)
    FROM t
) f
WHERE row_number = 1

보고:

+--------+--------+----+----------+
|date    |priority|data|row_number|
+--------+--------+----+----------+
|20200301|1       |0.3 |1         |
|20200302|2       |0.4 |1         |
|20200303|1       |0.8 |1         |
+--------+--------+----+----------+ 

주석에서 @david가 언급했듯이 "priority = min_priority_for_date"를 기준으로 행을 필터링하는 것이 더 효율적일 수 있습니다 (순위를 매기고 나중에 필터링하는 대신).

SELECT *
FROM t
WHERE (date, priority) IN (
    SELECT date, MIN(priority)
    FROM t
    GROUP BY date
)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관