【问题标题】:Getting the missing period through mmysql query or procedure..?通过 mysql 查询或过程获取缺少的期间..?
【发布时间】:2012-11-27 18:45:30
【问题描述】:

我有一个如下表customer_order

mysql> select * from customer_order;
+---------+---------+-----------+------------------+----------------+
| cust_id | orderno | region_cd | order_start_date |order_del_date  |
+---------+---------+-----------+------------------+----------------+
| CU_082  | ONO_001 | reg1      | 2012-04-25       | 2012-08-25     |
| CU_082  | ONO_002 | reg1      | 2012-04-28       | 2012-11-28     |
| CU_083  | ONO_002 | reg2      | 2012-04-28       | 2012-11-28     |
| CU_082  | ONO_003 | reg1      | 2012-04-25       | 2012-08-25     |
| CU_084  | ONO_004 | reg4      | 2012-04-25       | 2012-10-25     |

我需要一张这样的桌子……我得到……如下

mysql> select order_start_date,order_del_date,orderno,cust_id from customer_order wh
ere order_start_date >= '2012-04-25' AND order_del_date <='2012-12-28' and cust_i
d IN ('36082','36088') order by cust_id ;
+------------------+----------------+---------+---------+
| order_start_date | order_del_date | pid     | emp_id  |
+------------------+----------------+---------+---------+
| 2012-04-25       | 2012-05-25     | ONO_001 | CU_082  |
| 2012-08-22       | 2012-12-28     | ONO_004 | CU_082  |
| 2012-06-22       | 2012-08-28     | ONO_003 | CU_082  |
| 2012-05-27       | 2012-06-25     | ONO_002 | CU_082  |
| 2012-04-25       | 2012-05-25     | ONO_001 | CU_082  |
| 2012-05-27       | 2012-06-25     | ONO_001 | CU_082  |
| 2012-04-30       | 2012-06-25     | ONO_001 | CU_088  |
| 2012-06-28       | 2012-07-15     | ONO_002 | CU_088  |
| 2012-07-28       | 2012-08-25     | ONO_003 | CU_088  |
| 2012-07-16       | 2012-09-25     | ONO_004 | CU_088  |
+------------------+----------------+---------+---------+

现在我需要查询这张表... 要得到 对于这里的每个客户,我们在上表中获取从 wat 日期到 wat 日期期间的数据他的订单处理详细信息.. 现在对于每个客户,我会找到没有订单处理的时间段......

例如cust_id =CU_088 他的订单从 4 月 30 日到 6 月 25 日处理 6 月 28 日至 7 月 15 日的书房 (这里的 thr 是一个差异,即 thr 是在 6 月 26 日至 27 日期间未采取任何订单或进行任何处理..这是所需的结果) **另一个考虑因素是... 在下一个条目中,我们发现 thr 是从 7 月 28 日到 8 月 25 日的订单流程 w.r.t 之前的条目,即 6 月 28 日至 7 月 15 日,我们发现对于该客户,7 月 16 日至 27 日期间没有接受或处理订单。 但是最后一个条目是 7 月 16 日到 9 月 25 日,他有一个不同 order_no 的订单,因为这里填补了 7 月 16 日到 7 月 27 日的空白,所以这种情况也需要检查...... 我需要得到这样的输出..

+------------------+----------------+---------+---------+
| order_start_date | order_del_date | pid     | emp_id  |
+------------------+----------------+---------+---------+
| 2012-06-26       | 2012-06-27     | ONO_001 | CU_088  |
+------------------+----------------+---------+---------+

那是更有效的查询或程序应该给我在 thr 期间没有为客户执行任何操作... 帮我编写完成上述所有操作的查询。

我是数据库查询的新手..所以请帮帮我..

【问题讨论】:

  • 表格中是否有 6 月 26 日至 27 日的记录?

标签: mysql


【解决方案1】:

要获取订单之间的每个“差距”,您可以使用自联接:

SELECT   o1.cust_id,
         o1.order_del_date        + INTERVAL 1 DAY AS gap_begin,
         MIN(o2.order_start_date) - INTERVAL 1 DAY AS gap_end
FROM     customer_order o1
    JOIN customer_order o2 ON o1.cust_id = o2.cust_id
                          AND o1.order_del_date <= o2.order_start_date
GROUP BY o1.cust_id, o1.order_del_date
HAVING   gap_begin < gap_end

【讨论】:

  • 上述查询对 cust_id--CU_088 非常有效,但对其他查询无效...是否由于表中的条目..???
  • @AnuB:你能给出一些结果不正确的示例数据吗?
  • +------------------+----------------+----- ----+---------+ | order_start_date | order_del_date |进程号 | emp_id | +-----------------+----------------+---------+--- ------+ | 2012-04-25 | 2012-05-25 | ONO_001 | CU_082 | | 2012-08-22 | 2012-12-28 | ONO_004 | CU_082 | | 2012-06-22 | 2012-08-28 | ONO_003 | CU_082 | | 2012-05-27 | 2012-06-25 | ONO_002 | CU_082 | | 2012-04-25 | 2012-05-25 | ONO_001 | CU_082 | | 2012-05-27 | 2012-06-25 | ONO_001 | CU_082 |
  • 在上面的记录中我得到的结果是+--------+--------------+--------- ---+ | emp_id | period_start |期末 | +--------+-------------+------------+ | 36082 | 2012-06-26 | 2012-08-21 |这是不正确的...因为 2012-08-21 包含在其他一些顺序中
  • @AnuB:你能修改这个sqlfiddle,让它显示你的问题,然后把修改后的sqlfiddle地址的URL粘贴回来吗?
猜你喜欢
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多