我有一个像下面这样的mysql表
id trader price
111 abc 5
222 xyz 5.20
333 abc 5.70
444 xyz 5
555 abc 5.20
Run Code Online (Sandbox Code Playgroud)
我需要将第1行的价格与第2行的价格进行比较,然后根据给定的样本行2的价格小于第1行的价格,这意味着交易者xyz将价格提高一次,同样地,当我们将第2行的价格与第3行的价格进行比较时第3行价格高于第2行价格的价格,这意味着交易商abc也提高了价格一次.因此,我需要比较整个表格,找出每个交易者增加或减少价格的次数......
我不知道这样做,有人可以帮我这个
您可以执行"自联接"(将表连接到自身)来执行查询.这里棘手的部分是知道行插入表中的顺序,并且仅比较顺序(时间上)相邻的行.我假设您有某种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
Run Code Online (Sandbox Code Playgroud)
上面的查询将表连接到自身两次,以便每个选项卡代表以下内容:
我们对'tab c'执行LEFT OUTER JOIN,因为我们实际上并不希望该行存在.在where子句中,我们仅将结果过滤到"tab c"行不存在的结果.
最后,查询在交易者上执行'GROUP BY',而SUM()通过比较'a'和'b'行的价格来增加和减少.
这是一个有趣的挑战.希望这可以帮助!
约翰...
| 归档时间: |
|
| 查看次数: |
12611 次 |
| 最近记录: |