0

使用“标准”订单表,我试图找出特定客户购买了一定数量的物品的时间有多远。

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

所以我想知道 Fred 购买的最后 10 件物品所涵盖的时间范围,从现在开始,一直在回溯。

在这种情况下,我将尝试确定订单 ID 1、3、4 和 5 加在一起将我带到(或刚刚超过)我的目标总数 10 项,所以我正在寻找的日期是 2012 年 4 月 14 日。

有一个简单的解决方案吗?

4

3 回答 3

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;

然后语法可能会根据您使用的数据库而有所不同(更多信息)。

于 2012-04-26T15:12:53.217 回答
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

然后从这个结果中,您可以轻松地选择适当的行。

于 2012-04-26T15:16:45.223 回答
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 的解决方案更简洁。

于 2012-04-26T15:37:37.823 回答