안녕하세요 질문이 있어 이렇게 올립니다.
select 회원번호,count(수신일시) as cnt from 회원 수신테이블
where to_char(수신일시 ,'YYMMDD') > '220102'
회원별로 올해 1월부터 현재일까지 몇주차에 몇개의 메세지를 받았는지 아는 쿼리를 찾고 있습니다. 수신일시 기준으로 카운트를 하여 수신 횟수 를 구하고 있는데
제가 생각하는 구조는
---------------------------------------------------------------
회원번호 1주차 2주차 3주차 4주차....... 연속됨
----------------------------------------------------------------
1231 2 2 3 4
23412 4 0 2 1
31241
41242235
5324234
65645
테이블 자체는 수신을 받을 떄 마다 새로운 로우가 생성되는 로그성 테이블입니다.
어떤 쿼리를 써야 저런 결과를 뽑아 낼 수 있을까요? 답변 부탁드립니다.
감사합니다.
-- Oracle -- WITH t AS ( SELECT 111 id, DATE '2022-01-03' dt FROM dual UNION ALL SELECT 222, DATE '2022-01-04' FROM dual UNION ALL SELECT 111, DATE '2022-01-09' FROM dual UNION ALL SELECT 222, DATE '2022-01-10' FROM dual UNION ALL SELECT 111, DATE '2022-01-10' FROM dual UNION ALL SELECT 333, DATE '2022-01-17' FROM dual ) SELECT * FROM (SELECT id , TO_CHAR(dt, 'iw') + 0 iw FROM t WHERE dt >= TRUNC(sysdate, 'iy') ) PIVOT (COUNT(*) FOR iw IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 , 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 , 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 , 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 , 51, 52, 53 ) ) ORDER BY id ;
-- PostgreSQL -- WITH t AS ( SELECT 111 id, DATE '2022-01-03' dt UNION ALL SELECT 222, DATE '2022-01-04' UNION ALL SELECT 111, DATE '2022-01-09' UNION ALL SELECT 222, DATE '2022-01-10' UNION ALL SELECT 111, DATE '2022-01-10' UNION ALL SELECT 333, DATE '2022-01-17' ) SELECT id , COUNT(CASE iw WHEN '01' THEN 1 END) w01 , COUNT(CASE iw WHEN '02' THEN 1 END) w02 , COUNT(CASE iw WHEN '03' THEN 1 END) w03 , COUNT(CASE iw WHEN '04' THEN 1 END) w04 , COUNT(CASE iw WHEN '05' THEN 1 END) w05 , COUNT(CASE iw WHEN '06' THEN 1 END) w06 , COUNT(CASE iw WHEN '07' THEN 1 END) w07 , COUNT(CASE iw WHEN '08' THEN 1 END) w08 , COUNT(CASE iw WHEN '09' THEN 1 END) w09 , COUNT(CASE iw WHEN '10' THEN 1 END) w10 , COUNT(CASE iw WHEN '11' THEN 1 END) w11 , COUNT(CASE iw WHEN '12' THEN 1 END) w12 , COUNT(CASE iw WHEN '13' THEN 1 END) w13 , COUNT(CASE iw WHEN '14' THEN 1 END) w14 , COUNT(CASE iw WHEN '15' THEN 1 END) w15 , COUNT(CASE iw WHEN '16' THEN 1 END) w16 , COUNT(CASE iw WHEN '17' THEN 1 END) w17 , COUNT(CASE iw WHEN '18' THEN 1 END) w18 , COUNT(CASE iw WHEN '19' THEN 1 END) w19 , COUNT(CASE iw WHEN '20' THEN 1 END) w20 , COUNT(CASE iw WHEN '21' THEN 1 END) w21 , COUNT(CASE iw WHEN '22' THEN 1 END) w22 , COUNT(CASE iw WHEN '23' THEN 1 END) w23 , COUNT(CASE iw WHEN '24' THEN 1 END) w24 , COUNT(CASE iw WHEN '25' THEN 1 END) w25 , COUNT(CASE iw WHEN '26' THEN 1 END) w26 , COUNT(CASE iw WHEN '27' THEN 1 END) w27 , COUNT(CASE iw WHEN '28' THEN 1 END) w28 , COUNT(CASE iw WHEN '29' THEN 1 END) w29 , COUNT(CASE iw WHEN '30' THEN 1 END) w30 , COUNT(CASE iw WHEN '31' THEN 1 END) w31 , COUNT(CASE iw WHEN '32' THEN 1 END) w32 , COUNT(CASE iw WHEN '33' THEN 1 END) w33 , COUNT(CASE iw WHEN '34' THEN 1 END) w34 , COUNT(CASE iw WHEN '35' THEN 1 END) w35 , COUNT(CASE iw WHEN '36' THEN 1 END) w36 , COUNT(CASE iw WHEN '37' THEN 1 END) w37 , COUNT(CASE iw WHEN '38' THEN 1 END) w38 , COUNT(CASE iw WHEN '39' THEN 1 END) w39 , COUNT(CASE iw WHEN '40' THEN 1 END) w40 , COUNT(CASE iw WHEN '41' THEN 1 END) w41 , COUNT(CASE iw WHEN '42' THEN 1 END) w42 , COUNT(CASE iw WHEN '43' THEN 1 END) w43 , COUNT(CASE iw WHEN '44' THEN 1 END) w44 , COUNT(CASE iw WHEN '45' THEN 1 END) w45 , COUNT(CASE iw WHEN '46' THEN 1 END) w46 , COUNT(CASE iw WHEN '47' THEN 1 END) w47 , COUNT(CASE iw WHEN '48' THEN 1 END) w48 , COUNT(CASE iw WHEN '49' THEN 1 END) w49 , COUNT(CASE iw WHEN '50' THEN 1 END) w50 , COUNT(CASE iw WHEN '51' THEN 1 END) w51 , COUNT(CASE iw WHEN '52' THEN 1 END) w52 , COUNT(CASE iw WHEN '53' THEN 1 END) w53 FROM (SELECT id , TO_CHAR(dt, 'iw') iw FROM t WHERE dt >= DATE_TRUNC('week', DATE_TRUNC('year', NOW()) + INTERVAL '3' DAY) ) a GROUP BY id ORDER BY id ;