比较mysql中同一个表中的行

时间:2012-11-06 03:55:55

标签: mysql

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

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

2 个答案:

答案 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

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

  • 标签a:用于比较的最新行
  • 标签b:与
  • 进行比较的前一行
  • 标签c:&amp;之间的一行b timewise(不应该存在)

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

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

这是一个有趣的挑战。希望这有帮助!

...约翰

答案 1 :(得分:-1)

如果要跟踪价格变化的历史记录,则需要设置单独的表格。此外,当您引用列时,听起来像是指行。