예를 들어 카테고리별로 최대 날짜 그룹이있는 id를 선택하고 싶습니다. 결과는 다음과 같습니다. 7, 2, 6
id category date
1 a 2013-01-01
2 b 2013-01-03
3 c 2013-01-02
4 a 2013-01-02
5 b 2013-01-02
6 c 2013-01-03
7 a 2013-01-03
8 b 2013-01-01
9 c 2013-01-01
PostgreSQL에서이 작업을 수행하는 방법을 알 수 있습니까?
답변
이것은 DISTINCT ON
(Postgres 특정 표준 확장)에 대한 완벽한 사용 사례입니다 DISTINCT
.
SELECT DISTINCT ON (category)
id -- , category, date -- add any other column (expression) from the same row
FROM tbl
ORDER BY category, "date" DESC;
내림차순 정렬에주의하십시오. 열이 NULL 일 수있는 경우 다음을 추가 할 수 있습니다 NULLS LAST
.
DISTINCT ON
가장 간단하고 빠릅니다. 이 관련 답변에 대한 자세한 설명 :
큰 테이블의 경우 다음 대체 방법을 고려하십시오.
당 많은 행에 대한 성능 최적화 category
:
답변
이걸로 해봐:
SELECT t1.* FROM Table1 t1
JOIN
(
SELECT category, MAX(date) AS MAXDATE
FROM Table1
GROUP BY category
) t2
ON T1.category = t2.category
AND t1.date = t2.MAXDATE
이 SQLFiddle 보기
답변
또 다른 방법은 first_value
창 기능 을 사용하는 것입니다 : http://sqlfiddle.com/#!12/7a145/14
SELECT DISTINCT
first_value("id") OVER (PARTITION BY "category" ORDER BY "date" DESC)
FROM Table1
ORDER BY 1;
… 나는 hims056의 제안이 적절한 인덱스가있는 곳에서 일반적으로 더 잘 수행 될 것이라고 생각하지만.
세 번째 해결책은 다음과 같습니다.
SELECT
id
FROM (
SELECT
id,
row_number() OVER (PARTITION BY "category" ORDER BY "date" DESC) AS rownum
FROM Table1
) x
WHERE rownum = 1;
답변
tbl GROUP BY cat HAVING MAX (date)에서 id 선택