7

我有一个如下的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 也增加了一次价格。所以以这种方式,我需要比较整个表格并找出每个交易者增加或减少价格的次数......

我不知道该怎么做,有人可以帮我吗

4

2 回答 2

15

您可以执行“自连接”(将表连接到自身)来执行查询。这里的棘手部分是知道将行插入表中的顺序,并且只比较顺序(时间)相邻的行。我假设您有某种 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 之间的一行(不应该存在)

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

最后,查询对交易者执行“GROUP BY”,并通过比较“a”和“b”行的价格来 SUM()s 的增量和减量。

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

约翰...

于 2012-11-06T04:27:48.830 回答
-1

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

于 2012-11-06T04:06:02.490 回答