2016-06-01 10 views
1

열 A (BIGINT, 고객 계정 예 ID) 및 B 열 (날짜, 예 - 지난 구매 날짜)이있는 50K 행의 테이블이 있습니다.SQL의 날짜를 기준으로 백분율을 계산하십시오.

주어진 날짜 범위의 상위 25 % 타일, 상위 50 % 타일, 75 % 타일에서 마지막으로 구매 한 고객의 비율을 이해하고 싶습니다.이 모든 고객 계정 ID를 기반으로 말할 수 있습니다. 우리의 마지막 구매의 대다수는 비뚤어졌습니다. SQL에서 달성하는 방법에 어떤 생각?

테이블 : alltransations

ACCT_ID   | DATE 
----------------|--------------- 
23748234782947 | 05-15-2016 
28178792839838 | 05-01-2016 
28178092734538 | 02-12-2016 
28347732839867 | 01-15-2016 
28170909362959 | 10-10-2015 
28171334099090 | 11-11-2015 
28109129330023 | 12-25-2014 
28172377859289 | 10-31-2014 

답변

0

내가 바로 타일을 가지고 있는지 확실하지 않습니다,하지만 당신은 4 개 지역에 timerange을 나누어 의미하는 경우가 2016-에서 간격이 같이 일하는 것이 02-01부터 2016-06-01. 절충 : 수동으로 간격 계산; 가능한 한 너무

CREATE TABLE tblA (ACCT_ID INTEGER, PDATE DATE); 

INSERT INTO TblA(ACCT_ID, PDATE) VALUES (1000,'2016-05-21'); 
INSERT INTO TblA(ACCT_ID, PDATE) VALUES (1001,'2016-05-11'); 
INSERT INTO TblA(ACCT_ID, PDATE) VALUES (1002,'2016-05-24'); 
INSERT INTO TblA(ACCT_ID, PDATE) VALUES (1003,'2016-04-21'); 
INSERT INTO TblA(ACCT_ID, PDATE) VALUES (1004,'2016-02-12'); 
INSERT INTO TblA(ACCT_ID, PDATE) VALUES (1005,'2016-02-21'); 
INSERT INTO TblA(ACCT_ID, PDATE) VALUES (1001,'2016-03-22'); 
INSERT INTO TblA(ACCT_ID, PDATE) VALUES (1002,'2016-04-01'); 
INSERT INTO TblA(ACCT_ID, PDATE) VALUES (1005,'2016-04-01'); 
INSERT INTO TblA(ACCT_ID, PDATE) VALUES (1006,'2016-04-01'); 

    SELECT DISTR.DATE_RANGE, COUNT(DISTR.ACCT_ID)/OVRL.TOTALCNT 
FROM (SELECT 'TOP25' as DATE_RANGE, A.ACCT_ID 
     FROM tblA A 
     WHERE A.PDATE BETWEEN STR_TO_DATE('01.05.2016', '%m/%d/%Y') AND STR_TO_DATE('01.06.2016', '%m/%d/%Y') 
     UNION ALL 
     SELECT 'TOP50' as DATE_RANGE, B.ACCT_ID 
     FROM tblA B 
     WHERE B.PDATE BETWEEN STR_TO_DATE('01.04.2016', '%m/%d/%Y') AND STR_TO_DATE('01.06.2016', '%m/%d/%Y') 
     UNION ALL 
     SELECT 'TOP75' as DATE_RANGE, C.ACCT_ID 
     FROM tblA C 
     WHERE C.PDATE BETWEEN STR_TO_DATE('01.03.2016', '%m/%d/%Y') AND STR_TO_DATE('01.06.2016', '%m/%d/%Y') 
     UNION ALL 
     SELECT 'ALL' as DATE_RANGE, C.ACCT_ID 
     FROM tblA C 
     WHERE C.PDATE BETWEEN STR_TO_DATE('01.02.2016', '%m/%d/%Y') AND STR_TO_DATE('01.06.2016', '%m/%d/%Y')) DISTR 
, (SELECT COUNT(*) AS TOTALCNT FROM tblA A WHERE A.PDATE BETWEEN STR_TO_DATE('01.03.2016', '%m/%d/%Y') AND STR_TO_DATE('01.06.2016', '%m/%d/%Y')) OVRL 
GROUP BY DISTR.DATE_RANGE, OVRL.TOTALCNT 

ALL 10 10 
TOP25 3 10 
TOP50 7 10 
TOP75 8 10 
0

에게 동적 데이터 세트의 전체 날짜 범위에 따라 날짜 분위수를 만듭니다이 솔루션을 제공 할 것입니다, 날짜 계산을 통해이 작업을 수행 할 수 다음 ID의 비율을 표시 12 분위수에서 발생했습니다.

select unix_timestamp(min(date)) into @start from p; 
select unix_timestamp(max(date)) into @end from p; 
Set @25 = 0.25 *(@end - @start)[email protected]; 
Set @50 = 0.50 *(@end - @start)[email protected]; 
Set @75 = 0.75 *(@end - @start)[email protected]; 

SELECT 
CASE WHEN unix_timestamp(date)>@75 then 4 
WHEN unix_timestamp(date)>@50 then 3 
WHEN unix_timestamp(date)>@25 then 2 
ELSE 1 END as Quartile, 
round(count(id)/(select count(*) from p)*100,2) as Percentage 
FROM p 
GROUP BY Quartile; 

조금 더 자세하게 설명하고 형식을 지정하십시오.

범위의 시작과 끝의 절반에 날짜가있는 경우 Q1과 Q4가 동적으로 표시됩니다.

먼저 변수를 범위로 설정 한 다음 각 사 분위 또는 다른 시간 세그먼트 파티션으로 분할합니다.

성이 큰 날짜부터 작은 날짜까지 모두 계단식으로 계단식으로 배열합니다.보다 쉽게 ​​계산할 수 있도록 UNIX_TIMESTAMP 형식으로되어 있으며, 실패 할 경우 Quartile에서 Quartile로 전달됩니다.

동일한 구조를 사용하여 세그먼트, n- 타일로 날짜 범위를 분할 할 수 있습니다.