SQL 구문 통계 연속 로그 인 3 일 이상 의 사용자 사례 분석

31216 단어 빅 데이터
SQL 구문 통계 연속 로그 인 3 일 이상 의 사용자 사례 분석
이 문 제 는 비슷 한 문제 로 확대 할 수 있다. 몇 달 동안 회원 을 충전 하고 며칠 동안 상품 을 판매 하 며 계속 방울 을 맞 고 기한 을 넘 길 수 있다.
  • 테스트 데이터: 사용자 ID, 로그 인 날짜 uid, dt guid 01, 2018 - 02 - 28 guid 01, 2018 - 03 - 01 guid 01, 2018 - 03 - 02 guid 01, 2018 - 03 - 04 guid 01, 2018 - 03 - 05 guid 01, 2018 - 03 - 06 guid 01, 2018 - 03 - 07 guid 02, 2018 - 03 - 01 guid 02, 2018 - 03 - 02 guid 02, 2018 - 03 - 02 guid 02, 2018 - 03 - 03 guid 02, 2018 - 03 - 03 - 03 guid 02, 2018 - 03 - 06
  • 대상 표:
    +---------+--------+-------------+-------------+--+
    |   uid   | times  | start_date  |  end_date       |
    +---------+--------+-------------+-------------+--+
    | guid01  | 4      | 2018-03-04  | 2018-03-07  |
    | guid02  | 3      | 2018-03-01  | 2018-03-03  |
    +---------+--------+-------------+-------------+--+
    

    사고: sql 을 쓰 는 것 이지 1. 그룹 을 나 누고 정렬 하 며 줄 번 호 를 매 긴 다. 2. 시간 스탬프 - 줄 번 호 는 차이 에 따라 연속 적 인 전체 답 인지 확인 하도록 한다.
    select
     uid,min(dt),max(dt),count(1) as counts
     from
    	(
    	select
    	uid ,dt, date_sub(dt,rn) as dis
    	from
    		(
    		select
    		uid ,dt,row_number()over (partition by uid order by dt)rn
    		from continuous
    		)t1
    	)t2
    group by uid ,dis having counts>2 
    

    정 답: 1. 그룹 정렬 줄 번호 매기 기
    select
    uid ,dt,row_number()over (partition by uid order by dt)rn
    from continuous
    

    표 구현
    +------+-------------------+---+  
    |   uid|                 dt| rn|
    +------+-------------------+---+
    |guid02|2018-03-01 00:00:00|  1|
    |guid02|2018-03-02 00:00:00|  2|
    |guid02|2018-03-03 00:00:00|  3|
    |guid02|2018-03-06 00:00:00|  4|
    |guid01|2018-02-28 00:00:00|  1|
    |guid01|2018-03-01 00:00:00|  2|
    |guid01|2018-03-02 00:00:00|  3|
    |guid01|2018-03-04 00:00:00|  4|
    |guid01|2018-03-05 00:00:00|  5|
    |guid01|2018-03-06 00:00:00|  6|
    |guid01|2018-03-07 00:00:00|  7|
    +------+-------------------+---+
    

    2... 타임 스탬프 - 줄 번 호 는 차이 에 따라 연속 여 부 를 검사 합 니 다.
    select
    	uid ,dt, date_sub(dt,rn) as dis
    	from
    		(
    		select
    		uid ,dt,row_number()over (partition by uid order by dt)rn
    		from continuous
    		)t1
    

    표 구현
    +------+-------------------+----------+
    |   uid|                 dt|       dis|
    +------+-------------------+----------+
    |guid02|2018-03-01 00:00:00|2018-02-28|
    |guid02|2018-03-02 00:00:00|2018-02-28|
    |guid02|2018-03-03 00:00:00|2018-02-28|
    |guid02|2018-03-06 00:00:00|2018-03-02|
    |guid01|2018-02-28 00:00:00|2018-02-27|
    |guid01|2018-03-01 00:00:00|2018-02-27|
    |guid01|2018-03-02 00:00:00|2018-02-27|
    |guid01|2018-03-04 00:00:00|2018-02-28|
    |guid01|2018-03-05 00:00:00|2018-02-28|
    |guid01|2018-03-06 00:00:00|2018-02-28|
    |guid01|2018-03-07 00:00:00|2018-02-28|
    +------+-------------------+----------+
    

    3. 연속 적 인 연결 을 위해 같은 count (1) 함수 로 줄 의 총 수 를 계산한다.
     select
      uid,min(dt),max(dt),count(1) as counts
      from
      	(
      	select
      	uid ,dt, date_sub(dt,rn) as dis
      	from
      		(
      		select
      		uid ,dt,row_number()over (partition by uid order by dt)rn
      		from continuous
      		)t1
      	)t2
    group by uid 
    

    표 구현
    +------+-------------------+-------------------+------+
    |   uid|            min(dt)|            max(dt)|counts|
    +------+-------------------+-------------------+------+
    |guid02|2018-03-01 00:00:00|2018-03-03 00:00:00|     3|
    |guid01|2018-02-28 00:00:00|2018-03-02 00:00:00|     3|
    |guid01|2018-03-04 00:00:00|2018-03-07 00:00:00|     4|
    +------+-------------------+-------------------+------+
    

    4. 이런 결 과 를 얻 은 점 포 는 중복 되 어 수입 이 가장 좋 은 점 포 를 나타 내기 위해 이 를 바탕 으로 2 층 select 를 한다.
     select
     *
     from
     (
     select
     *,
     row_number() over(partition by uid order by counts desc) aa
     from
      (
      select
      uid,min(dt),max(dt),count(1) as counts
      from
      	(
      	select
      	uid ,dt, date_sub(dt,rn) as dis
      	from
      		(
      		select
      		uid ,dt,row_number()over (partition by uid order by dt)rn
      		from continuous
      		)t1
      	)t2
    group by uid 
    )t3
     )t4
     where aa = 1
    

    표 구현:
    +------+-------------------+-------------------+------+
    |   uid|            min(dt)|            max(dt)|counts|
    +------+-------------------+-------------------+------+
    |guid02|2018-03-01 00:00:00|2018-03-03 00:00:00|     3|
    |guid01|2018-02-28 00:00:00|2018-03-02 00:00:00|     3|
    |guid01|2018-03-04 00:00:00|2018-03-07 00:00:00|     4|
    +------+-------------------+-------------------+------+
    

    이것 은 본인 의 프로필 입 니 다. 더 좋 은 방법 이 있 으 면 댓 글로 남 겨 주세요.

    좋은 웹페이지 즐겨찾기