有以下两张表,一张是交易表一张客户信息表
需求是提取出 201712 月每天第一个下单的客户。
最后一个下单的时间信息。
展示字段为: 日期、第一个下单时间、第一个下单客户、最后下单时间、最后下单客户。
分析 :第一个下单和最后一个下单,分别可以用 Max 和 Min 函数得出。
下单的客户和下单信息都在同一张表,因此不用做其它表关联。
根据:第一笔下单时间(唯一)– > 第一笔下单的客户(√)
最后一笔下单时间(唯一)-> 最后一笔下单的客户 (√)
一个错误的示范:
如果为了要让客户编号出现,便自行添加到 Group by 后面。
那这样就不只返回最早和最晚的下单用户,反倒把 当天所有的人都返回。
SELECT d.busi_date,
d.cust_piy_no,
MIN(exch_time) AS min_exch_time,
MAX(exch_time) AS max_exch_time
FROM deli_t d
WHERE SUBSTR(d.busi_date, 1, 6) = '201712'
GROUP BY d.busi_date, d.cust_piy_no
因此,当我们首先找到一个 最小(最早)下单日期 , 最大(最晚)下单日期 。然后,我们做表的自身连接,用 唯一的交易时间 作为表的关联(On)去匹配对应的客户信息。
SELECT tmp.busi_date AS 日期,
d1.exch_time AS 第一个下单时间,
d1.cust_piy_no AS 第一个下单客户,
d2.exch_time AS 最后下单时间,
d2.cust_piy_no AS 最后下单客户
FROM (
SELECT d.busi_date,
MIN(exch_time) AS min_exch_time,
MAX(exch_time) AS max_exch_time
FROM deli_t d
WHERE SUBSTR(d.busi_date,1,6)='201712' -- d.busi_date 为字符串类型
GROUP BY d.busi_date -- 找到了最早最晚下单的,) tmp
JOIN deli_t d1
ON d1.busi_date=tmp.busi_date
AND d1.exch_time=tmp.min_exch_time -- 第一个下单
JOIN deli_t d2
ON d2.busi_date=tmp.busi_date
AND d2.exch_time=tmp.max_exch_time -- 最后一个下单
ORDER BY tmp.busi_date;
第二种方法 可以一分为二,即将最早下单时间和客户信息作为表 1(table a), 然后再计算出最晚下单时间和客户信息作为表 2(table b).
然后 table a union all table b.