使用“标准”订单表,我试图找出特定客户购买一定数量商品的时间。
Order ID Items Client Date
-------- ----- ------ ----
1 1 Fred 26/04/2012
2 3 John 25/04/2012
3 2 Fred 20/04/2012
4 5 Fred 18/04/2012
5 3 Fred 14/04/2012
6 4 Fred 10/04/2012
所以我想知道弗雷德购买的最后10件物品所涵盖的时间范围,从现在起开始工作。
在这种情况下,我会尝试识别订单ID 1,3,4和& 5加在一起带我到(或刚刚过去)我的目标总共10项,所以我要找的日期是14/04/2012。
这有一个简单的解决方案吗?
答案 0 :(得分:0)
没有简单的方法,只要你拥有它就可以做到。
如果您要跟踪订购了哪些商品,则可以加入Items表,这样每个商品就有一行。然后你可以选择前10名。
select *
from Orders o
join OrderItems oi on oi.orderId = o.orderId
join Items i on i.itemId = oi.itemId
where o.Client = 'Fred'
order by o.Date
limit 10;
然后语法可能会因您使用的数据库(more info)而异。
答案 1 :(得分:0)
解决此问题的一种方法是计算购买商品的总运行总额:
select
orders.*,
sum(
select items
from orders as `inner`
where client = "Fred" and
`outer`.`date` <= `inner`.`date`
) as `Running total`
from orders as `outer`
where client = "Fred"
order by date desc;
请注意选择列表中的子查询,该子查询总结了Fred在该日期或之后购买的商品数量。
输出应该是这样的:
Order ID Items Client Date Running total
-------- ----- ------ ---- -------------
1 1 Fred 26/04/2012 1
3 2 Fred 20/04/2012 3
4 5 Fred 18/04/2012 8
5 3 Fred 14/04/2012 11
6 4 Fred 10/04/2012 15
然后从这个结果中,您可以轻松选择合适的行。
答案 2 :(得分:0)
脱离我的头顶......
CREATE FUNCTION time_of_last(itemcount INT, custid VARCHAR(50))
RETURNS DATE
BEGIN
DECLARE tally INT DEFAULT 0;
DECLARE ondate DATE;
DECLARE curritems IN DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT t.items, t.orderdate FROM yourtable t
WHERE customer=custid ORDER BY orderdate DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ondate = NULL;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO curritems, ondate;
SET tally = tally+curritems;
IF (tally>=itemcount) THEN
LEAVE read_loop;
END IF;
END LOOP;
CLOSE cur1;
RETURN ondate;
END;
SELECT time_of_last(10, 'Fred');
请注意,如果您想开始收集其他信息,例如套装中的订单,那么Matt Fenwick的解决方案就更清晰了。