code

PostgreSQL에서 카테고리별로 최대 날짜 그룹으로 ID를 선택하는 방법은 무엇입니까?

codestyles 2020. 10. 29. 08:09
반응형

PostgreSQL에서 카테고리별로 최대 날짜 그룹으로 ID를 선택하는 방법은 무엇입니까?


예를 들어 카테고리별로 최대 날짜 그룹이있는 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 선택

참고 URL : https://stackoverflow.com/questions/16914098/how-to-select-id-with-max-date-group-by-category-in-postgresql

반응형