PostgreSQL의 조건부 선도/지연 함수
귀하의 작업은 주어진 테이블에서 사용자에 대한 특정 활동 순서를 검색하는 쿼리를 생성하는 것입니다. 각 사용자에 대해 그룹 B의 다음 활동(항상 그룹 A 활동 이후에 발생)을 결정하려고 합니다.
문제 정의
다음 표를 고려하세요.
Name | activity | time |
---|---|---|
user1 | A1 | 12:00 |
user1 | E3 | 12:01 |
user1 | A2 | 12:02 |
user2 | A1 | 10:05 |
user2 | A2 | 10:06 |
user2 | A3 | 10:07 |
user2 | M6 | 10:07 |
user2 | B1 | 10:08 |
user3 | A1 | 14:15 |
user3 | B2 | 14:20 |
user3 | D1 | 14:25 |
user3 | D2 | 14:30 |
이 테이블에 대해 원하는 출력 is:
Name | activity | next_activity |
---|---|---|
user1 | A2 | NULL |
user2 | A3 | B1 |
user3 | A1 | B2 |
해결책
창과 함께 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은 수행하지만 조건부 창 기능을 직접 지원하지 않는 경우(예: 리드(활동) FILTER (WHERE 활동 LIKE 'A%')) FILTER를 활용할 수 있습니다. 절을 집계 함수와 함께 사용하여 창 함수로 사용합니다.
lead(activity) FILTER (WHERE activity LIKE 'A%') OVER () AS activity
그러나 이 접근 방식은 대규모 데이터 세트에는 비효율적이고 비실용적입니다. 대신 위에 제시된 솔루션은 소규모 및 대규모 데이터 세트 모두에 권장됩니다.
위 내용은 창 함수를 사용하여 PostgreSQL에서 그룹 A 활동을 따르는 그룹 B의 다음 활동을 어떻게 찾을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!