2016-06-01 3 views
1

У меня есть таблица с 50k строками, которая имеет столбец A (BIGINT, пример идентификатора учетной записи клиента) и столбец B (дата, пример - последняя дата покупки).Вычислить процентили на основе дат в SQL

Я хотел бы понять, что% покупателей совершили свою последнюю покупку в верхней части 25% плитки, верхней 50% плитки, 75% плитки заданного диапазона дат, поэтому я могу рассказать на основе всех этих идентификаторов аккаунта клиентов, где большинство наших последних покупок перекошены. Любые мысли о том, как достичь в 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

Я не уверен, если я вас правильно с плитками, но если вы имеете в виду путем деления вверх 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

Это решение будет динамически создавать даты квартили на основе полного диапазона дат вашего набора данных, затем отображает процент идентификаторов которые имели место в квартили:

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; 

Here is a functional example с немного большим количеством деталей и форматирования.

Если у вас есть половина ваших дат в начале вашего диапазона и половина в конце, вы будете видеть только Q1 и Q4 динамически.

Первый набор переменных как диапазон, затем разделение на каждый квартиль или другой сегмент сегмента времени.

Оператор CASE содержит каскады от больших до небольших дат, все в UNIX_TIMESTAMP формат для упрощения арифметики, передается от квартили до квартили, поскольку он терпит неудачу.

Эта же структура может использоваться для разделения диапазонов дат по сегментам, n-плиткам.