【问题标题】:Compare rows in same table in mysql在mysql中比较同一表中的行
【发布时间】:2012-11-06 03:55:55
【问题描述】:

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

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

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

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

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

    约翰...

    【讨论】:

    • 嗨,约翰,非常感谢您的询问帮助我了解了这个问题。这很有帮助...非常感谢您的大力帮助
    • 如果这回答了您的问题,请接受它作为答案。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 是的,很抱歉,我将行称为列...您能帮我解决一下吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2020-03-09
    相关资源
    最近更新 更多