如何排除在mySQL中聚合的行对?

时间:2016-11-16 12:05:56

标签: mysql aggregation

我们对行动进行了审计跟踪,并且我被要求报告这些行动的平均时间。

不幸的是,审计跟踪包含“取消”条目,实质上是排除了之前的操作。

所以,有些数据。

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 个答案:

答案 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)