我在涉及下表的复杂查询时遇到了一些麻烦。假设时间正在使用内置的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
。
答案 0 :(得分:2)
您将自己加入购买表,然后选择其中一个标准。
这里唯一真正的诀窍是制定不同的时间标准:
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加入对自己的购买,首先检查您是否将之前的购买与之后的购买进行比较,然后在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
的情况。但这有点超出了编写此查询的基本问题。