안녕하세요
기간은 2014-01-01 부터 2014-12-31 까지 로그인 한 기록을 추출 하는 내용인데요.
연속 3개월 접속 id 를 뽑는겁니다. mssql 이구요
USER_LOGIN 테이블에 user_inID (로그인 한 ID), user_indate(로그인 한 날짜) 등등 로그인시 가져올수있는 기록들은 다 기록됩니다.
쿼리--------------------------------------------------------------
select count(*)
from(
select
A.user_inID,
STUFF((
select DISTINCT ','+
(case when CONVERT(char(7),UL1.user_indate,120)='2014-01' THEN '1'
when CONVERT(char(7),UL1.user_indate,120)='2014-02' THEN '2'
when CONVERT(char(7),UL1.user_indate,120)='2014-03' THEN '3'
when CONVERT(char(7),UL1.user_indate,120)='2014-04' THEN '4'
when CONVERT(char(7),UL1.user_indate,120)='2014-05' THEN '5'
when CONVERT(char(7),UL1.user_indate,120)='2014-06' THEN '6'
when CONVERT(char(7),UL1.user_indate,120)='2014-07' THEN '7'
when CONVERT(char(7),UL1.user_indate,120)='2014-08' THEN '8'
when CONVERT(char(7),UL1.user_indate,120)='2014-09' THEN '9'
when CONVERT(char(7),UL1.user_indate,120)='2014-10' THEN 'a'
when CONVERT(char(7),UL1.user_indate,120)='2014-11' THEN 'b'
when CONVERT(char(7),UL1.user_indate,120)='2014-12' THEN 'c' else '0' END)
from USER_LOGIN as UL1
where UL1.user_inID = A.user_inID and CONVERT(char(7),UL1.user_indate,120) BETWEEN '2014-01' and '2014-02'
group by UL1.user_indate
FOR XML PATH('')), 1, 1, '') as num
from
(
SELECT DISTINCT user_inID, count(*) as cnt
FROM USER_LOGIN
where CONVERT(char(7),user_indate,120) BETWEEN '2014-01' and '2014-12'
group by user_inID having count(*) > '2'
) as A
) as re_UL
where re_UL.number like '%2,3,4%'
-----------------------------------------------------------------------------------------
이렇게 짰습니다. 급하다보니깐..
출력은 ID랑 DATE 만 나오게 해서 DATE에 해당 아이디 로그인 시간을 , (콤마)로 연결 해주었습니다.
group by user_inID having count(*) > '2' 부분은 연속 4개월 접속해도 연속 3개월 접속한거니깐 이렇게 처리 해주었구요.
where re_UL.number like '%2,3,4%' << 이부분에서 1,2,3 이라던지 2,3,4 라던지 연속 숫자를 넣어줘서 전체 카운팅을 했습니다.
짜고나서 생각해보니 만약 이게 10년 대상을 월별로 추출 하면 엄천난 노가다가 필요 할꺼 같더라구요.
그래서
첫번째 질문은 위 쿼리를 기간을 대량으로 잡았을경우 처리 할수있는 쿼리를 부탁드립니다.
두번재는 위와 조금 관련 된거지만 (위 쿼리를 보시면 날짜를 코드와 했습니다.)
A1 | A2
--------------------------------------
a | 123abc
b | 456abczxc
c | 123zxc
d | 123
e | 123456
이 테이블에서
A2 의 값을 중심으로 123이 들어 갔있으면 re_A,
456이 들어 가있으면 re_B,
abc 가 들어 가있으면 re_C
로 하여 그룹을 지어서 카운팅 하는 방법 가르켜 주세요.
결과 (re_A는 a, b,d,e로 4개, re_B는 b,e로 2개, re_C는 a,b로 2개 )
A1 | A2
----------------------
re_A | 4
re_B | 2
re_C | 2
부탁 드립니다!!
Comment 1
-
향지
2015.05.12 13:50
문자는 연속된 시간인지 구분하기 힘들어서
시간 형식으로 바꿔주시구요
아래 방식처럼 하시면 됩니다.
월을 숫자로 바꿔서
연속된 숫자인지 체크하기 위해 순번을 매겨서 -를 했습니다.
연속된 숫자인경우 같은 숫자가 나오게 됩니다.
;with user_time as
(
select 1 as User_InID, '2014-01-01' as User_InDate UNION ALL
select 1 as User_InID, '2014-02-01' as User_InDate UNION ALL
select 1 as User_InID, '2014-04-01' as User_InDate UNION ALL
select 1 as User_InID, '2014-05-01' as User_InDate UNION ALL
select 1 as User_InID, '2014-06-01' as User_InDate UNION ALL
select 2 as User_InID, '2014-01-01' as User_InDate UNION ALL
select 2 as User_InID, '2014-03-01' as User_InDate UNION ALL
select 2 as User_InID, '2014-04-01' as User_InDate UNION ALL
select 2 as User_InID, '2014-06-01' as User_InDate
)
select User_InID
, min(User_InDate) as StartDt
, max(User_InDate) as FinishDt
, count(*) as during
from
(
select User_InID
, User_InDate
, Diff-Seq as Ck
from
(
select User_InID
, User_InDate
, ROW_NUMBER() OVER (PARTITION BY User_InID ORDER BY User_InDate) AS Seq
, DATEDIFF(MONTH, '2000-01-01', User_InDate) AS Diff
from user_time
) as a
) as a
group by User_InID, Ck
having count(*)>=3 -- 3개월 이상