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 중국어 웹사이트의 기타 관련 기사를 참조하세요!