有以下两张表,一张是交易表一张客户信息表
需求是提取出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.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。