涉及时间戳的复杂查询

时间:2012-06-10 16:17:08

标签: mysql sql sqlite

我在涉及下表的复杂查询时遇到了一些麻烦。假设时间正在使用内置的sqlite timestamp数据类型。

我正在努力让第二次购买的顾客在第一次购买后的4小时内退货。如果在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

1 个答案:

答案 0 :(得分:2)

您将自己加入购买表,然后选择其中一个标准。

这里唯一真正的诀窍是制定不同的时间标准:

  1. 所做的购买<在不同的商店2个小时。
  2. 购买时间为2到4小时,与store_id无关。
  3. 这两者显然都适用于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加入对自己的购买,首先检查您是否将之前的购买与之后的购买进行比较,然后在OR条件中应用两个不同的条件。

    我发现时间比较最容易与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移到join子句中,您可以获得一些效率。尽管这些少量数据的执行计划是相同的,但对于大量数据而言,这可能会更快。在进行更昂贵的比较之前,您希望优化器消除所有p1.purchase_time > p2.purchase_time的情况。但这有点超出了编写此查询的基本问题。