> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL에서 사용자당 마지막 'A' 및 후속 'B' 활동을 효율적으로 추출하는 방법은 무엇입니까?

PostgreSQL에서 사용자당 마지막 'A' 및 후속 'B' 활동을 효율적으로 추출하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-31 02:14:10
원래의
794명이 탐색했습니다.

How to Efficiently Extract the Last 'A' and Subsequent 'B' Activities per User in PostgreSQL?

PostgreSQL의 조건부 선도/지연 함수

활동이 A 유형과 B 유형으로 그룹화되어 B 활동이 항상 A 활동을 따르는 PostgreSQL 테이블에서 사용자는 다음을 추구합니다. 각 사용자의 마지막 A 활동과 후속 B 활동을 추출하는 솔루션입니다. 처음에는 Lead() 함수가 유망한 접근 방식처럼 보였지만 효과적이지 않은 것으로 판명되었습니다.

조건부 창 함수

안타깝게도 PostgreSQL은 현재 조건부 창 기능을 지원하지 않습니다. 창 함수에 대한 조건부 필터링을 제공할 수 있는 FILTER 절은 집계 함수에만 사용할 수 있습니다.

논리적 의미 및 해결 방법

핵심 통찰력은 문제 설명의 논리적 의미에 있습니다. 각 사용자마다 하나 이상의 A 활동 뒤에 최대 하나의 B 활동이 있습니다. 이는 DISTINCT ON 및 CASE 문과 함께 단일 창 함수를 사용하는 솔루션을 제안합니다.

SELECT name
     , CASE WHEN a2 LIKE 'B%' THEN a1 ELSE a2 END AS activity
     , CASE WHEN a2 LIKE 'B%' THEN a2 END AS next_activity
FROM  (
   SELECT DISTINCT ON (name)
          name
        , lead(activity) OVER (PARTITION BY name ORDER BY time DESC) AS a1
        , activity AS a2
   FROM   t
   WHERE (activity LIKE 'A%' OR activity LIKE 'B%')
   ORDER  BY name, time DESC
   ) sub;
로그인 후 복사

성능 고려 사항

소수의 사용자 및 활동의 경우 위의 쿼리는 별도의 조건 없이 적절하게 수행될 가능성이 높습니다. 색인. 그러나 행 수와 사용자 수가 증가함에 따라 성능을 최적화하기 위해 대체 기술이 필요할 수 있습니다.

잠재적 최적화

대량 데이터의 경우 보다 맞춤화된 접근 방식을 사용하는 것이 좋습니다.

  • 시간상 NULL 값이 허용되는 경우 ORDER BY 절에 NULLS LAST를 추가하세요.
  • 사용 패턴 일치 표현 활동 ~ '^[AB]' 활동 LIKE 'A%' OR 활동 LIKE 'B%'
  • 설명된 것과 같이 각 그룹의 첫 번째 행을 선택하는 기술을 탐색합니다. 이 문서의 내용은 다음과 같습니다. [각 GROUP BY에서 첫 번째 행 선택 그룹?](https://stackoverflow.com/questions/18923181/select-first-row-in-each-group-by-group)
  • 특히 다음과 같은 경우 GROUP BY 쿼리를 최적화하기 위한 고급 기술을 조사하세요. 사용자당 많은 수의 행 처리: [GROUP BY 쿼리를 최적화하여 사용자당 최신 행 검색 사용자](https://dba.stackexchange.com/questions/55252/optimize-group-by-query-to-retrieve-latest-row-per-user)

위 내용은 PostgreSQL에서 사용자당 마지막 'A' 및 후속 'B' 활동을 효율적으로 추출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿