SQL은

2017-11-08 1 views
1

내가 샘플 데이터 형식SQL은

user, code, source

있는 테이블이 있다고 가정

p1, a-b-c-d, g1 
p2, b-c-d, g1 
p4, q-a-b-c-d, g2 
p5, b-e-d, g3 
p6, q-a-c-d, g2 
p7, c-d, g3 
p3, a-b-a-a-d-e, g2 
p8, a-b-a-a-d-e, g2 

난을 작성하려면 쿼리에서 코드에 문자 'b'가있는 모든 사용자를 선택한 다음 바로 뒤에 오는 문자로 그룹화합니다.

예를 들어상의 출력은 이상이어야합니다 :

count, group 

3,c 
1,e 
2,a 

항상 존재하는 경우 'B'다음 편지가있을 것입니다 분명합니다. 명확하게

select count(a.user), (string_to_array(a.code,'-'))[2] 
from [table] a 
where a.code LIKE 'b' 
group by 2 

그러나이 후 간단한 GROUP BY, 다음 값을 얻기 위해

답변

1

당신은 unnest with ORDINALITYLEAD를 사용할 수 있습니다 작동하지 않습니다 :

는 지금 내 쿼리처럼 보이는

CREATE TABLE t 
AS 
SELECT 'p1' "user", 'a-b-c-d' code, 'g1' source 
UNION ALL SELECT'p2', 'b-c-d', 'g1' 
UNION ALL SELECT'p4', 'q-a-b-c-d', 'g2' 
UNION ALL SELECT'p5', 'b-e-d', 'g3' 
UNION ALL SELECT'p6', 'q-a-c-d', 'g2' 
UNION ALL SELECT'p7', 'c-d', 'g3' 
UNION ALL SELECT'p3', 'a-b-a-a-d-e', 'g2' 
UNION ALL SELECT'p8', 'a-b-a-a-d-e', 'g2'; 

검색어 :

WITH cte AS (
    select * , LEAD(elem) OVER(PARTITION BY "user", code, source ORDER BY nr) grp 
    from t a 
    LEFT JOIN LATERAL unnest(string_to_array(a.code,'-')) 
      WITH ORDINALITY AS s(elem, nr) ON TRUE 
) 
SELECT grp, COUNT(*) 
FROM cte 
WHERE elem = 'b' 
GROUP BY grp; 

DBFiddle Demo