比较mysql中同一个表中的行

use*_*864 5 mysql

我有一个像下面这样的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也提高了价格一次.因此,我需要比较整个表格,找出每个交易者增加或减少价格的次数......

我不知道这样做,有人可以帮我这个

Joh*_*ler 9

您可以执行"自联接"(将表连接到自身)来执行查询.这里棘手的部分是知道行插入表中的顺序,并且仅比较顺序(时间上)相邻的行.我假设您有某种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)

上面的查询将表连接到自身两次,以便每个选项卡代表以下内容:

  • 选项卡a:用于比较的最近一行
  • tab b:要比较的前一行
  • tab c:a&b timewise之间的一行(不应该存在)

我们对'tab c'执行LEFT OUTER JOIN,因为我们实际上并不希望该行存在.在where子句中,我们仅将结果过滤到"tab c"行不存在的结果.

最后,查询在交易者上执行'GROUP BY',而SUM()通过比较'a'和'b'行的价格来增加和减少.

这是一个有趣的挑战.希望这可以帮助!

约翰...


小智 -1

如果您想跟踪价格变化的历史记录,您将需要设置一个单独的表。另外,当您提到列时,听起来像是指行。