mysql - 根据 SQL 中的日期计算百分位数

标签 mysql sql distribution percentile

我有一个包含 50k 行的表,其中包含 A 列(BIGINT,示例客户帐户 ID)和 B 列(日期,示例 - 上次购买日期)。

我想了解有多少客户在给定日期范围的前 25%、前 50%、前 75% 的板 block 进行了最后一次购买,因此我可以根据所有这些客户账户 ID 判断我们最近购买的大部分商品都偏向于。关于如何在 sql 中实现的任何想法?

表:所有交易

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

最佳答案

我不确定我是否正确理解了这些图 block ,但如果您的意思是将时间范围划分为四个区域,那么从 2016-02-01 到 2016-06-01 的时间间隔会像这样工作。 Tradeoff :手动计算区间;可能有人也可以通过日期计算来做到这一点

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

关于mysql - 根据 SQL 中的日期计算百分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37559580/

相关文章:

matlab - 模拟来自联合累积分布函数的样本?

iphone - Entitlements.plist 未正确创建

c++ - 解决来自 const 的无效转换

javascript - 如何生成唯一代码

mysql - 找出每个人最后 X 条记录的平均值

numpy - "force" `scipy.stats.norm.rvs` 可以输出正值吗?

php - 在带有选定列名的 php 查询中应用 MySQL COUNT()

MySQL 行或列

java - 在 Hibernate 中使用 LIKE %

mysql - 无法添加 FK 约束 #1215