2016-12-05 37 views
-2

我在mysql中創建了一個表。在mysql中選擇與它們對應的最後一行不同的項目

CREATE TABLE t (id int,item int, dt DATE, qty INT); 
INSERT INTO t VALUES 
(1,1,'2007-1-1',5),(2,1,'2007-1-2',6), (3,1,'2007-1-3',7),(4,1,'2007-1-4',8), 
(5,1,'2007-1-5',9),(6,1,'2007-1-6',10),(7,1,'2007-1-7',11),(8,1,'2007-1-8',12), 
(9,1,'2007-1-9',13), (10,2,'2007-1-1',6), (11,2,'2007-1-2',7),(12,2,'2007-1-3',8), 
(13,2,'2007-1-4',9), (14,2,'2007-1-5',10), (15,2,'2007-1-6',11),(16,2,'2007-1-7',12), 
(17,2,'2007-1-8',13), (18,2,'2007-1-9',14); 

enter image description here

我想找到exponential moving average每個項目。

所以我找到了一個代碼。

select item,dt,qty, 
    @a := (@a*.3 + qty*.7) AS moving_avg 
from t 
Join (select @a := 0) as X 
group by item,moving_avg,qty,dt 
order by item,qty,dt 

我得到了結果。

enter image description here

,但我想選擇排的每個項目,我在我的形象都強調只有最後一個條目。

i'e我最後的表應該只包含

item dt      qty  moving_avg 
1  09-Jan-07 12:00:00 AM 13 12.571358275 
2  09-Jan-07 12:00:00 AM 14 13.5715860340449 

即。與其對應的最後一行不同的項目。 任何想法如何做到這一點? 可能通過調整我的代碼均線本身

回答

1

你需要在一個子查詢檢索每個項目的最大dt延長您的代碼對你的結果,這也需要推入子查詢加入這個:

select t1.* 
    from 
     (select item,dt,qty, 
      @a := (@a*.3 + qty*.7) AS moving_avg 
     from t 
     Join (select @a := 0) as X 
     group by item,moving_avg,qty,dt 
     order by item,qty,dt) t1 
    inner join 
     (select item, max(dt) as maxdt 
     from t 
     group by item) t2 on t1.item=t2.item and t1.dt=t2.maxdt 

注意:如果您有兩個記錄,每個項目的值完全相同dt,則查詢將返回它們兩個。

+0

先生,它不能有價值會因爲日期而改變,因爲它是一個移動平均值 – Shubham

+0

當我在同一日期有不同數量的多個項目時,代碼不起作用。 我試着在你的代碼中做總和(數量),但它移動平均值給我7的倍數。有什麼方法可以解決它? (http://sqlfiddle.com/#!9/25ea42/4) – Shubham

+0

有一件事,我認爲是創建一箇中間表t2,它將做sum(product_views),然後使用t2移動avg .. 有什麼更好的點子?而不創建中間表。 – Shubham

相關問題