2016-11-16 17 views
0

我們對行爲進行了審計跟蹤,並且我被要求報告這些行動所花費的平均時間。如何排除在mySQL中聚合的行對數?

不幸的是,審計線索包含「取消」條目,其本質上排除了之前的操作。

所以,一些數據。

AuditTrail 
ID OrderID ActionQty ActionDate 
1 1  1  2002-02-02 
2 2  1  2002-02-02 
3 1  -1  2003-03-03 
4 1  1  2004-04-04 

Orders 
OrderID OrderDate 
1  2001-01-01 
2  2002-02-02 

的基準日期的比較的區別ActionDate。

這是所需的平均值。

在上面的例子中,AuditTrail條目1和3需要被排除,因爲條目3是'取消',因此需要排除先前的非取消條目(條目1)。 這些ID是連續的,但不一定是連續的訂單,因爲有很多訂單和許多審計線索條目。

更復雜的是,我們可以看到'取消'的運行,它需要進一步向下滾動。

例如

AuditTrail 
ID OrderID ActionQty ActionDate 
1030 99  1  2002-02-02 
1031 99  1  2002-02-02 
1032 99  -1  2003-03-03 
1033 99  -1  2004-04-04 

在這個例子中,在2和2進行。

所以。

平均值除以總數。我們可以很容易地使用SUM(ActionQty)(GROUP'd BY AuditTrail.OrderID)來獲得訂單的正確數量。

獲取AuditEntry的天數也很容易(TIMESTAMPDIFF(DAY, Orders.OrderDate, AuditTrail.ActionDate))。

但排除正確的......我無法解決它。

任何線索?

+1

所以在這最後一個例子,這將是對'天的訂單審計entry'數的結果99?它是否爲'0',因爲所有審計線都被取消了?我想,另一種要問的方式是:「根據您的示例數據,您期望的結果是什麼?」 – JNevill

+0

是的。我沒有錯過預期的/期望的結果。 OrderID 1將是3y3m3d(無論以天爲單位)。 OrderID 2將爲0 OrderID 99將爲0 –

回答

1

您可以使用行號方法進行匹配。 給出

MariaDB [sandbox]> select * from t; 
+------+---------+-----------+------------+ 
| ID | OrderID | ActionQty | ActionDate | 
+------+---------+-----------+------------+ 
| 1 |  1 |   1 | 2002-02-02 | 
| 2 |  2 |   1 | 2002-02-02 | 
| 3 |  1 |  -1 | 2003-03-03 | 
| 4 |  1 |   1 | 2004-04-04 | 
| 1030 |  99 |   1 | 2002-02-02 | 
| 1031 |  99 |   1 | 2002-02-02 | 
| 1032 |  99 |  -1 | 2003-03-03 | 
| 1033 |  99 |  -1 | 2004-04-04 | 
+------+---------+-----------+------------+ 
8 rows in set (0.00 sec) 

這個查詢

Select s.id,s.orderid,s.actionqty,s.actiondate 
from 
(
select t.*, 
     if(t.orderid<>@p ,@rn:=1,@rn:[email protected]+1) rn, 
     @p:=t.orderid p 
from t,(select @block:=0,@rn:=0,@p:=0) rn 
where actionqty > 0 
order by orderid,id 
)s 
left join 
(
select t.*, 
     if(t.orderid<>@p ,@rn:=1,@rn:[email protected]+1) rn, 
     @p:=t.orderid p 
from t,(select @block:=0,@rn:=0,@p:=0) rn 
where actionqty < 0 
order by orderid,id 
) cans on s.orderid = cans.orderid and s.rn = cans.rn 
where cans.id is null 

結果

+------+---------+-----------+------------+ 
| id | orderid | actionqty | actiondate | 
+------+---------+-----------+------------+ 
| 4 |  1 |   1 | 2004-04-04 | 
| 2 |  2 |   1 | 2002-02-02 | 
+------+---------+-----------+------------+ 
2 rows in set (0.00 sec) 
+0

在mysql上,因此不能無法重用table't'。 : -/ –

+0

嘗試用你的表名替換t –

+0

@RichardAQuadling - 爲什麼?是臨時表嗎?因爲這是在查詢中無法兩次訪問表的主要原因。 – Kickstart