programing

PostgreSQL에서 범주별로 최대 날짜 그룹이 있는 ID를 선택하는 방법은 무엇입니까?

easyjava 2023. 5. 9. 23:11
반응형

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에서 어떻게 하는지 알 수 있을까요?

이는 표준의 Postgres 특정 확장에 대한 완벽한 사용 사례입니다.DISTINCT:

SELECT DISTINCT ON (category)
       id  -- , category, date  -- 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

SQLFidle 보기

또 다른 접근 방식은 다음과 같습니다.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;

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

반응형