【问题标题】:How to group MySQL tables calculating the difference between each table's total traveled distance如何对 MySQL 表进行分组,计算每个表的总行驶距离之间的差异
【发布时间】:2014-11-05 17:17:20
【问题描述】:

我在每一行都有一个(非常大的)表格,存储总行程和当前日期。所以我需要一个适合大量记录的解决方案。例如在 2014-10-03 09:00:00 我走了 1 公里然后我将当前日期和 2101.00km 插入到 totalTrip 字段(totalTrip 从 2100 开始,可以从任何数字开始)。下一小时,我又走了 5 公里,并将总行程存储为 2105.00 公里。第二天,我又走了 10 公里,并将日期 2014-10-04 05:00:00 和总行程作为 2115.00km 插入数据库。 结果,我需要按天对行进行分组,并且只获取每个特定日期的公里数。我怎样才能以最短和有效的方式做到这一点,并且可以通过使用“分组依据”来实现吗?我希望我能解释一下我的情况。

这里(示例)我所拥有的:

id     date                    totalTrip
1      2014-10-03 09:00:00     2100.23
2      2014-10-03 10:00:00     2102.33
3      2014-10-04 05:00:00     2112.35
4      2014-10-05 02:00:00     2120.37
5      2014-10-05 03:00:00     2140.41
6      2014-10-05 05:00:00     2155.45

这里(示例)我想要什么:

date         traveledDistance
2014-10-03   2.10
2014-10-04   10.03
2014-10-05   43.10

【问题讨论】:

  • @Strawberry 它应该是 10.02 但它是 (2112.35 - 2102.33),因为这是他们前一天离开的那一天的距离。

标签: mysql sql


【解决方案1】:
  DROP TABLE IF EXISTS my_table;

  CREATE TABLE my_table
  (id     INT NOT NULL AUTO_INCREMENT PRIMARY KEY
  ,date                    DATETIME NOT NULL
  ,totalTrip DECIMAL(7,2) NOT NULL
  );

  INSERT INTO my_table VALUES
  (1      ,'2014-10-03 09:00:00',     2100.23),
  (2      ,'2014-10-03 10:00:00',     2102.33),
  (3      ,'2014-10-04 05:00:00',     2112.35),
  (4      ,'2014-10-05 02:00:00',     2120.37),
  (5      ,'2014-10-05 03:00:00',     2140.41),
  (6      ,'2014-10-05 05:00:00',     2155.45);

  SELECT DATE(a.date) date
       , SUM(a.diff) total 
    FROM 
       ( SELECT y.*
              , MIN(y.totaltrip)-x.totaltrip diff 
           FROM my_table x 
           JOIN my_table y 
             ON y.id > x.id 
          GROUP 
             BY x.id
       ) a 
   GROUP 
      BY DATE(a.date);
  +--------------+-------+
  | date         | total |
  +--------------+-------+
  | 2014-10-03   |  2.10 |
  | 2014-10-04   | 10.02 |
  | 2014-10-05   | 43.10 |
  +--------------+-------+

解释:每行的行进距离从其最近的后续行的距离中减去MIN(y.totaltrip)-x.totaltrip。之后,所有这些中间结果按日期求和。就是这样。

请注意,如果“非常大”实际上是指“非常非常大”(非常不可能),那么使用变量的解决方案将明显更快。

【讨论】:

  • +1 不错。介意也很少解释。只是想理解。
  • 是的,知道了。感谢您提供详细信息。如果您在答案中包含评论,那就太好了。
  • @Strawberry 谢谢你,太好了,你是最棒的;)。顺便说一句,使用变量是什么意思? (我认为可能会记录多达一百万条记录,如果发生不太可能的情况,我只是想做好准备:))
  • 一百万? - 呸,那是花生。改天我们可以做变量。
【解决方案2】:

让我们称表为“table_name”:

SELECT 
    foo.date, SUM(foo.totalTrip - table_name.totalTrip) AS totalTrip
FROM
    table_name
        INNER JOIN
    (SELECT id - 1 AS id, date, totalTrip FROM table_name) AS foo
         ON foo.id = table_name.id
GROUP BY date

【讨论】:

  • 为什么需要限制条款?
  • 第一行为空!试试看。
  • 我只是想知道它为什么在那里,它似乎不会有影响,是吗?
  • 第一行是空的,因为你使用了 LEFT JOIN,对吧?
  • 可以省略。但第一行为空。
猜你喜欢
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多