> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL에서 그룹 A의 마지막 활동 이후 그룹 B의 후속 활동을 어떻게 찾을 수 있습니까?

PostgreSQL에서 그룹 A의 마지막 활동 이후 그룹 B의 후속 활동을 어떻게 찾을 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-28 05:31:10
원래의
945명이 탐색했습니다.

How Can I Find the Subsequent Activity from Group B After the Last Activity from Group A in PostgreSQL?

PostgreSQL의 조건부 리드/지연 함수

다양한 사용자 및 타임스탬프에 대한 활동이 포함된 테이블이 있습니다. 각 사용자에 대해 그룹 A의 마지막 활동을 식별한 다음 그룹 B의 후속 활동을 결정하려고 합니다.

리드 기능 사용

처음에는 이 문제를 해결하기 위해 Lead() 함수를 사용하려고 했습니다. 그러나 리드() 함수 자체는 조건에 관계없이 단순히 다음 값을 순서대로 검색하기 때문에 이 작업에 충분하지 않습니다.

조건부 창 함수(FILTER)

창 함수에 조건을 효과적으로 적용하기 위해 PostgreSQL에서는 FILTER 절을 제공합니다. 불행하게도 이 절은 집계 함수에만 사용할 수 있으므로 현재 Lead() 및 lag()와 같은 실제 창 함수에 대해서는 구현되지 않습니다.

DISTINCT ON을 사용하는 대체 솔루션

FILTER 없이 이 문제를 해결하기 위해 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;
로그인 후 복사

이 접근 방식은 DISTINCT ON 절을 활용하여 행을 사용자별로 그룹화하고 각 사용자에 대해 그룹 A에서 마지막으로 적합한 활동을 선택합니다. CASE 문은 지정된 조건에 따라 적절한 활동과 후속 활동을 결정하는 데 사용됩니다.

대규모 데이터 세트를 위한 최적의 솔루션

행 수가 많은 경우 사용자별로 대체 기술이 더 효율적일 수 있습니다. 이러한 기술에는 일반적으로 임시 테이블 생성 또는 고급 인덱싱 전략 사용이 포함됩니다. 그러나 최적의 접근 방식은 데이터 및 워크로드의 구체적인 특성에 따라 달라질 수 있습니다.

위 내용은 PostgreSQL에서 그룹 A의 마지막 활동 이후 그룹 B의 후속 활동을 어떻게 찾을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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