0

次のようなテーブル 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  |
+------------------+----------------+---------+---------+

今、私はこのテーブルでクエリを実行する必要があります...ここで各顧客を取得するには、上記のテーブルのワット日付からワット日付までの期間のデータを取得します..今、各顧客について、その期間を見つける必要がありますthrは注文処理なし...

たとえばcust_id =CU_088 、彼は 4 月 30 日から 6 月 25 日までの注文を 6 月 28 日から 7 月 15 日まで処理しています (ここで thr は diff で、thr は注文を受けていないか、6 月 26 日から 27 日までに処理が行われています。これが必要な結果です)。 ) **もう 1 つのインプに関する考慮事項は... 次のエントリでは、前のエントリに対して 7 月 28 日から 8 月 25 日までの注文プロセスであることがわかります。つまり、6 月 28 日から 7 月 15 日まで、この顧客の注文は処理されていないことがわかります。 7月16日から27日まで..しかし、最後のエントリtatが7月16日から9月25日である場合、彼は別の注文を持っています_7月16日から7月27日までのギャップはここで埋められるため、この種の条件も確認する必要があります..このような出力を取得する必要があります..

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

それは、より効率的なクエリまたは手順のいずれかであり、顧客に対して何のアクションも行われなかった期間を教えてくれるはずです...上記のすべてを実行するクエリを作成するのを手伝ってください。

私はdbクエリが初めてです..だから私を助けてください..

4

1 に答える 1

0

注文間のすべての「ギャップ」を取得するには、自己結合を使用できます。

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
于 2012-08-31T05:30:08.723 に答える