mysql - 比较mysql中同一个表中的行

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

我不知道该怎么做,有人可以帮我解决这个问题吗

最佳答案

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

相关文章:

php - 为 Sql 表中的每一行循环一个 If 语句

mysql - CakePHP 是在代码级别处理 FK,还是我也应该将 FK 添加到我的数据库中?

mysql - 选择首次出现的推荐人值(value)为 AdWords 且出现多次的用户

php - 如何使用include函数通过php变量将数据库查询的结果返回到另一个页面

mysql - INSERT INTO...SELECT - 主键冲突 - 错误 #1062

MySQL - CET 和 CEST 之间的区别

php - 如何制作包含引号等字符的 Web 服务器 URL?

php - 自动导入CSV文件并上传到数据库

mysql - 使用batch检测数据库是否存在,如果不存在则创建

mysql - 为什么使用 ResultSet 时会得到一个额外的结果为 null?