1

次のテーブルを含む複雑なクエリで問題が発生しています。時間が組み込みの sqlite タイムスタンプ データ型を使用していると仮定します。

2 回目の購入が最初の購入から 4 時間以内で、2 時間以内の場合は別のストアから購入した顧客に返品しようとしています。

最初の購入と 2 番目の購入を比較するために特定の行を参照する方法に頭を悩ませています。

購入

purchase_id | customer_id | store_id | purchase_time
     1             1            1      2009-01-27 10:00:00.0
     2             1            2      2009-01-27 10:30:00.0
     3             2            1      2009-01-27 10:00:00.0
     4             2            1      2009-01-27 10:30:00.0
     5             3            1      2009-01-27 10:00:00.0
     6             3            2      2009-01-27 16:00:00.0
     7             4            3      2009-01-27 10:00:00.0
     8             4            3      2009-01-27 13:00:00.0

店舗

store_id | misc columns...
    1
    2
    3

顧客

customer_id | f_name
     1         name1
     2         name2
     3         name3
     4         name4

この場合、正しい戻り値になりますname1, name4

4

1 に答える 1

2

購入テーブルをそれ自体に結合し、2 つの条件のいずれかを選択します。

ここでの唯一の本当のトリックは、さまざまな時間基準を次のように定式化することです。

  1. 別の店舗で 2 時間以内に行われた購入。
  2. に関係なく、2 時間から 4 時間の間に行われた購入store_id

どちらも明らかに同じに適用されますcustomer_id

だから、私たちは持っています:

select p1.purchase_id purchase_1, 
       p2.purchase_id purchase_2,
       c.name,
       p1.customer_id customer
from purchases p1
join purchases p2 on
p1.customer_id = p2.customer_id
join customer c on c.customer_id = p1.customer_id
where p1.purchase_time < p2.purchase_time
 and (
        (
        addtime(p1.purchase_time,'2:00:00') >= p2.purchase_time
        and p1.store_id <> p2.store_id
        )
      or
        (
        addtime(p1.purchase_time,'2:00:00') < p2.purchase_time
        and addtime(p1.purchase_time,'4:00:00') >= p2.purchase_time
        )
     )

これは、customer_id によって購入を結合し、最初に以前の購入と後の購入を比較していることを確認し、次にORed の基準で 2 つの異なる基準を適用します。

時間の比較は で行うのが最も簡単でaddtime()、結果を比較するのが最も簡単だと思います。他の人は他の方法を好むかもしれません。

SQL フィドルはこちら: http://sqlfiddle.com/#!2/14dda/2

結果:

PURCHASE_1  PURCHASE_2        NAME        CUSTOMER
1           2                 name1       1
7           8                 name4       4

--

p1.purchase_time < p2.purchase_time編集: おそらく、 up をjoin句に移動することで、ある程度の効率が得られるでしょう。この少量のデータの実行計画は同じですが、これは大量のデータでより高速になる可能性があります。p1.purchase_time > p2.purchase_timeコストのかかる比較を行う前に、オプティマイザーでこれらのケースをすべて排除したいと考えています。しかし、これは、このクエリを作成する方法に関する基本的な問題からは少し外れています。

于 2012-06-10T16:46:31.000 に答える