[SQL] 확률 통계 기능

21103 단어 SQL
확률 통계 기능
  • 1 누적
  • 1.1 기초 누적
  • 1.2 조 누적
  • 1.3 누적 확률
  • 2 전 월 대비 전년
  • 3 일 활 착 률 계산
  • 복습:
    MySQL 언어 실행 순서
    from
    on
    join
    where
    group bysum()having
    select
    distinct
    union
    order by
    

    거듭
    1.1 기초 누적
    주문서 만 들 기
    create table SC (id varchar(10),dt datetime(10),orderamt decimal(18,1));
    insert into SC values('01' , '2018-01-01' , 2);
    insert into SC values('02' , '2018-01-02' , 3);
    insert into SC values('03' , '2018-01-03' , 5);
    insert into SC values('04' , '2018-01-04' , 10);
    select * from SC;
    

    Output:
    id
    dt
    orderamt
    01
    2018-01-01
    2
    02
    2018-01-02
    3
    03
    2018-01-03
    5
    04
    2018-01-04
    10
    누적 알고리즘
      • 부 등 값 으로 연결 하기   • 실행 순서: 먼저 join on, 그 다음 group by, sum
    select a.id, a.dt, a.orderamt, sum(b.orderamt) as cum 
    	from SC a
    	join SC b
    	on a.dt >= b.dt  
    	group by a.id, a.dt, a.orderamt;
    

    Output:
    id
    dt
    orderamt
    cum
    01
    2018-01-01
    2
    2
    02
    2018-01-02
    3
    5
    03
    2018-01-03
    5
    10
    04
    2018-01-04
    10
    20
    1.2 조 누적
    주문서 만 들 기
    create table SC (id varchar(10),dt datetime(10),orderamt decimal(18,1));
    insert into SC values('01' , '2018-01-01' , 2);
    insert into SC values('02' , '2018-01-02' , 7);
    insert into SC values('03' , '2018-02-03' , 5);
    insert into SC values('04' , '2018-02-04' , 10);
    select * from SC;
    

    Output:
    id
    dt
    orderamt
    01
    2018-01-01
    2
    02
    2018-01-02
    7
    03
    2018-02-03
    5
    04
    2018-02-04
    10
    누적 알고리즘: 월 별로 그룹 을 나 누 어 누적 합 니 다.
      • 부 등 값 으로 연결 하기   • 실행 순서: 먼저 join on, 그 다음 group by, sum
    방법 1: 가장 간단 한 MySQL 문법 으로 쓰기
    select a.id, a.dt, a.orderamt, sum(b.orderamt) as cum 
    	from SC a
    	join SC b
    	on a.dt >= b.dt and substr(a.dt, 1, 7) = substr(b.dt, 1, 7)
    	group by a.id, a.dt, a.orderamt;
    
    	--   :substr(string, start, length)
    

    방법 2: 창 함수: 한 마디 로 해결!!
    select *, 
        sum(orderamt) over (partition by substr(dt, 1, 7) order by dt) as cum 
        from SC; 
    
    	--         :      ,partition by ,order ,sum  
    

    Output:
    id
    dt
    orderamt
    cum
    01
    2018-01-01
    2
    2
    02
    2018-01-02
    7
    9
    03
    2018-01-03
    5
    5
    04
    2018-01-04
    10
    15
    1.3 누적 확률
    계산 사고:   • 첫 번 째 단계: 한 달 에 sumtotalk 의 표 • 2 단계: 1.2 로 얻 은 월 별 누적 / 월 별 sumtotal 의 시계, 누적 확률% 획득
    방법 1: 가장 간단 한 MySQL 문법 으로 쓰기
    select aa.id, aa.dt, bb.mon, aa.orderamt, aa.cum, bb.total, 
        (round(cum * 100.00 / total ,2)  || '%' )  as cum_pct 
        
        from (
        
            (select a.id, a.dt, a.orderamt, substr(a.dt, 1, 7) as mon,sum(b.orderamt) as cum
                from SC a
                join SC b
                on a.dt >= b.dt and substr(a.dt, 1, 7) = substr(b.dt, 1, 7)
                group by a.id, a.dt, a.orderamt) aa    -- Step1.      
    
            left join --Step3.  aa  /bb         %
    
            (select dt, substr(dt, 1, 7) as mon, sum(orderamt) as total 
                from SC
                group by mon) bb     -- Step2.   sum_total    
    
            on aa.mon = bb.mon
            
        );
            
    

    방법 2: 창 함수 partition by 로 쓰기
    select aa.id, aa.dt, aa.mon, aa.orderamt, aa.cum, bb.total, 
        (round(cum * 100.00 / total ,2)  || '%' )  as cum_pct  from
        
        (
        
        (select *, substr(dt, 1, 7) as mon,
            sum(orderamt) over (partition by substr(dt, 1, 7) order by dt) as cum 
            from SC) aa -- Step1.      
        
        left join --Step3.  aa  /bb         %
    
        (select substr(dt, 1, 7) as mon, sum(orderamt) as total 
            from SC 
            group by mon) bb  -- Step2.   sum_total    
    
        on aa.mon = bb.mon
        
        );
    

    Output:
    id
    dt
    mon
    orderamt
    cum
    total
    cum_pct
    01
    2018-01-01
    2018-01
    2
    2
    9
    22.22%
    02
    2018-01-02
    2018-01
    7
    9
    9
    100.0%
    03
    2018-02-01
    2018-02
    5
    5
    15
    33.33%
    04
    2018-02-02
    2018-02
    10
    15
    15
    100.0%
    2. 전년 동기 대비
    3. 일 일, 유 존 률 을 계산한다.
    참고 문헌 [1] 초 형의 잡화점https://cloud.tencent.com/developer/article/1587654
    [2] 동기 대비, 전 월 대비 계산https://cloud.tencent.com/developer/article/1587652
    [3] 통계 일 일 · 유치https://cloud.tencent.com/developer/article/1587655

    좋은 웹페이지 즐겨찾기