不知道如何描述我試圖從這個問題得到什麼,但這裏去...根據原始行從另一個表的平均更新行
我有一張客戶購買表' t1',包含關於購買的信息:客戶ID,日期,如果客戶是獨自一人,則爲布爾值,以及購買金額。在第二個表中t2
是具有日期和布爾型的相同客戶ID的另一個列表,表明他們是否是單獨的。
我想更新第二個表格,其中包含他們之前做過的x次購買的值的平均值,以及它們是否是單獨的。
我的設置與表:
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1 (cid INT, d DATE, i INT, v FLOAT);
INSERT INTO t1 (cid, d,i,v) VALUES (1,'2001-01-01', 0, 10);
INSERT INTO t1 (cid, d,i,v) VALUES (1,'2001-01-02', 1, 20);
INSERT INTO t1 (cid, d,i,v) VALUES (1,'2001-01-03', 1, 30);
INSERT INTO t1 (cid, d,i,v) VALUES (1,'2001-01-04', 1, 40);
INSERT INTO t1 (cid, d,i,v) VALUES (1,'2001-01-05', 0, 50);
INSERT INTO t1 (cid, d,i,v) VALUES (1,'2001-01-06', 0, 60);
INSERT INTO t1 (cid, d,i,v) VALUES (1,'2001-01-07', 0, 70);
INSERT INTO t1 (cid, d,i,v) VALUES (1,'2001-01-08', 1, 80);
INSERT INTO t1 (cid, d,i,v) VALUES (1,'2001-01-09', 0, 90);
INSERT INTO t1 (cid, d,i,v) VALUES (2,'2001-01-04', 1, 35);
CREATE TABLE t2 (cid INT, d DATE, i INT, av2 FLOAT, av3 FLOAT);
INSERT INTO t2 (cid, d,i) VALUES (1,'2001-01-07', 0);
INSERT INTO t2 (cid, d,i) VALUES (1,'2001-01-08', 1);
INSERT INTO t2 (cid, d,i) VALUES (2,'2001-01-08', 0);
INSERT INTO t2 (cid, d,i) VALUES (2,'2001-01-09', 1);
av2
和av3
在哪裏,我想最後2
或3
交易的平均列。所以我需要一個更新聲明(真的有兩個聲明,一個用於av2,另一個用於av3)來說:「當這個客戶進入這個日期,並且他們獨自進來或沒有進貨時,他們最後一次x購買的平均值是多少。」
因此所產生的數據應該是:
CID二AV2 AV3
1 2001年1月7日0 55 40
1 2001年1月8日1 35 40
2 2001- 01-08 0 null null
2 2001-01-08 1 35 35
我得到的最接近是這樣的:
UPDATE t2 SET av=(
SELECT AVG(tcol)
FROM (
SELECT v AS tcol FROM t1 LIMIT 2
) AS tt);
這似乎在朝着正確的方向(限2是想通過AV列2
或3
。但是,這只是平均x先前購買(不管客戶或布爾值)。只要我在WHERE子句中鏈接數據,它就會扼殺:
UPDATE t2 SET av=(
SELECT AVG(tcol)
FROM (
SELECT v AS tcol FROM t1 WHERE t1.d<t2.d and t1.i=t2.i LIMIT 2
) AS tt);
任何想法?有什麼我想要做的名字嗎?我需要以不同的方式來描述嗎?有什麼建議麼?
謝謝, 菲利普
它被稱爲「移動平均值」或「滾動平均值」。兩個很好的解決方案在這裏: [http://stackoverflow.com/questions/878473/how-do-i-calculate-a-moving-average-using-mysql](http://stackoverflow.com/questions/878473/我怎麼做,我計算移動平均使用MySQL) – jaeheung 2013-08-17 01:53:13