我有一个像下面这样的 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 也提高了一次价格。所以以这种方式我需要比较整个表格并找出每个交易者增加或减少价格的次数...
我不知道该怎么做,有人可以帮我解决这个问题吗
最佳答案
您可以执行“自连接”(将表连接到自身)来执行查询。这里棘手的部分是知道行插入表中的顺序,并且只比较顺序(时间上)相邻的行。我假设您有某种 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 timewise 之间的一行(不应该存在)
我们对“选项卡 c”执行左外连接,因为我们实际上不希望该行存在。在 where 子句中,我们仅将结果过滤为不存在“tab c”行的结果。
最后,查询对交易者执行“GROUP BY”,并通过比较“a”行和“b”行中的价格对增量和减量求和。
这是一个有趣的挑战。希望这对您有所帮助!
约翰...
关于mysql - 比较mysql中同一个表中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13244136/