您可以执行“自连接”(将表连接到自身)来执行查询。这里的棘手部分是知道将行插入表中的顺序,并且只比较顺序(时间)相邻的行。我假设您有某种 TIMESTAMP 列,它会告诉您哪些价格变化发生在之前的价格变化之后。如果不是,那么也许“ID”可以通知您(在较小的 ID 之后插入较大的 ID 行)。
调用您的表“TAB”,使用“TRADER”提供连接,并使用“ID”提供订单,查询将需要三向自连接,如下所示:
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”,并通过比较“a”和“b”行的价格来 SUM()s 的增量和减量。
这是一个有趣的挑战。希望这可以帮助!
约翰...