我们对行动进行了审计跟踪,并且我被要求报告这些行动的平均时间。
不幸的是,审计跟踪包含“取消”条目,实质上是排除了之前的操作。
所以,有些数据。
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)
)。
但排除正确的......我无法解决这个问题。
任何线索?
答案 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:=@rn+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:=@rn+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)