我有一个类似下面的mysql表
id trader price
111 abc 5
222 xyz 5.20
333 abc 5.70
444 xyz 5
555 abc 5.20
我需要将第1行的价格与第2行的价格进行比较,然后根据给定的样本行2的价格小于第1行的价格,这意味着交易者xyz将价格提高一次,并且以同样的方式比较第2行的价格行3的价格,其中第3行的价格高于第2行的价格,这意味着交易商abc也提高了价格一次。因此,我需要比较整个表格,找出每个交易者增加或减少价格的次数......
我不知道这样做,有人可以帮我这个
答案 0 :(得分:8)
您可以执行“自联接”(将表连接到自身)以执行查询。这里棘手的部分是知道行插入表中的顺序,并且仅比较顺序(时间上)相邻的行。我假设您有某种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 c'执行LEFT OUTER JOIN,因为我们实际上并不希望该行存在。在where子句中,我们仅将结果过滤到“tab c”行不存在的结果。
最后,查询在交易者上执行'GROUP BY',而SUM()通过比较'a'和'b'行的价格来增加和减少。
这是一个有趣的挑战。希望这有帮助!
...约翰
答案 1 :(得分:-1)
如果要跟踪价格变化的历史记录,则需要设置单独的表格。此外,当您引用列时,听起来像是指行。