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 テーブルに結合して、アイテムごとに 1 つの行を作成できます。あとはトップ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;

次に、使用している DB によって構文が異なる場合があります (詳細)。

于 2012-04-26T15:12:53.217 に答える
0

この問題に取り組む 1 つの方法は、購入したアイテムの現在の合計を計算することです。

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 が購入したアイテムの数を合計する select リストのサブクエリに注意してください。

出力は次のようになります。

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 に答える