PLSQl-练习题2Groupby-多个字段不一定返回唯一值

31次阅读

共计 1095 个字符,预计需要花费 3 分钟才能阅读完成。

有以下两张表,一张是交易表一张客户信息表

需求是提取出 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.

正文完
 0