如何查询表中的相同数据,但输出行位置不同

时间:2019-04-13 13:12:28

标签: mysql

我在数据库中有一个表,就像下面的示例一样,我想查询相同的数据,但是在第2列中,数据的位置比以前的数据大1行。

P.S。我实际上是在为电表读数制作系统,我需要读取Current(第1列)和Previous(第2列)数据,以便能够计算出电表的总消耗量。但是我很难做到这一点。任何建议将不胜感激。谢谢。 :)

示例数据:

enter image description here

所需查询输出:

enter image description here

1 个答案:

答案 0 :(得分:2)

请记住,SQL表行没有固有的顺序。它们只是记录袋。

您必须根据某些列值或其他条件对它们进行排序。对于您的情况,我想您需要每个帐户的最近和第二次读表。大概您的阅读表中的列是这样的:

reading_id    customer_id    datestamp    value
   1            1122         2009-02-11    112
   2            1234         2009-02-13     18
   3            1122         2009-03-08    125
   4            1234         2009-03-10     40
   5            1122         2009-04-12    160
   6            1234         2009-04-11     62

我想您需要这种结果集

   customer_id    datestamp   value    previous
    1122          2009-03-08    125        112
    1122          2009-04-12    160        125
    1234         ...etcetera.

你怎么能得到这个?对于表中的每一行,您都需要一种方法来查找同一位客户的先前读数:即带有

的行
  • 相同的客户ID
  • 发生在当前日期戳之前的最新日期戳。

这是所谓的关联子查询的工作。这是带有子查询的查询。 (https://www.db-fiddle.com/f/hWGAbq4uAbA5f15j7oZY9o/0

SELECT aft.customer_id, 
       aft.datestamp, 
       (  SELECT bef.value
            FROM r bef                               /* row from table.... */
           WHERE bef.datestamp < aft.datestamp       /* with datestamp < present datestamp */
             AND bef.customer_id = aft.customer_id   /* and same customer id */
           ORDER BY bef.datestamp DESC               /* most recent first */
           LIMIT 1                                   /* only most recent */
        ) prev,              
        aft.value
  FROM r aft
 ORDER BY aft.customer_id, aft.datestamp

请注意,处理每个客户的一读内容需要在您的业务流程中进行一些思考。