활동이 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;
소수의 사용자 및 활동의 경우 위의 쿼리는 별도의 조건 없이 적절하게 수행될 가능성이 높습니다. 색인. 그러나 행 수와 사용자 수가 증가함에 따라 성능을 최적화하기 위해 대체 기술이 필요할 수 있습니다.
대량 데이터의 경우 보다 맞춤화된 접근 방식을 사용하는 것이 좋습니다.
위 내용은 PostgreSQL에서 사용자당 마지막 'A' 및 후속 'B' 활동을 효율적으로 추출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!