您可以执行“自联接”(将表连接到自身)来执行查询.这里棘手的部分是知道行插入表中的顺序,并且仅比较顺序(时间上)相邻的行.我假设您有某种TIMESTAMP列,它会告诉您之前的价格变化.如果没有,则可能“ID”可以通知您(较小的ID之后插入的ID更大的行).
调用表’TAB’,使用’TRADER’提供连接,并使用’ID’提供Order,查询将需要三向自连接,如下所示:
SELECT a.trader
, SUM(IF(a.price > b.price, 1, 0)) nbr_incr
, SUM(IF(a.price < b.price, 1, 0)) nbr_decr
, SUM(IF(a.price = b.price, 1, 0)) nbr_same
FROM tab a
JOIN tab b
ON a.trader = b.trader AND a.id > b.id
LEFT OUTER JOIN tab c
ON a.trader = c.trader AND a.id > c.id AND b.id < c.id
WHERE c.id IS NULL
GROUP BY a.trader
上面的查询将表连接到自身两次,以便每个选项卡代表以下内容:
> tab a:用于比较的最近一行
> tab b:要比较的前一行
> tab c:a&之间的一行. b时间(不应该存在)
我们对’tab c’执行LEFT OUTER JOIN,因为我们实际上并不希望该行存在.在where子句中,我们仅将结果过滤到“tab c”行不存在的结果.
最后,查询在交易者上执行’GROUP BY’,而SUM()通过比较’a’和’b’行的价格来增加和减少.
这是一个有趣的挑战.希望这可以帮助!
约翰…