MySQL相同列的2个不同日期之间的最大差异

时间:2015-08-04 00:05:51

标签: mysql database mysqli

我有这个表结构:

CREATE TABLE `points` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`date` datetime DEFAULT NULL,
`latitude` decimal(15,10) DEFAULT NULL,
`longitude` decimal(15,10) DEFAULT NULL,
`weight` decimal(10,3) DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

现在我想计算按纬度和经度(返回纬度,经度,最大重量差异)分组的2个不同日期之间的最大重量差异。好吗?

示例如下(假设我想计算2015年8月2日到2015年8月3日之间的差异)

id  |   date    | latitude | longitude | weight
-----------------------------------------------
1   | 8/2/2015  | 11111    | 22222     | 12
2   | 8/2/2015  | 11111    | 22222     | 8
3   | 8/2/2015  | 66666    | 88888     | 10
4   | 8/3/2015  | 11111    | 22222     | 5
5   | 8/3/2015  | 66666    | 88888     | 3

返回的元组应该是:

latitude | longitude | weight
-----------------------------
11111    | 22222     | 15

提前致谢!

2 个答案:

答案 0 :(得分:0)

使用子查询获取每天每个坐标的权重总和。然后加入,减去权重,并使用php找到最大值。

php

答案 1 :(得分:0)

您可以使用条件聚合并自行保存连接和聚合:

select p.*, abs(weight1 - weight2) as diff
from (select latitude, longitude,
             sum(case when date = '2015-08-02' then weight else 0 end) as weight1,
             sum(case when date = '2015-08-03' then weight else 0 end) as weight2
      from points p
      where date in ('2015-08-02', '2015-08-03')
      group by latitude, longitude
     ) ll
order by diff desc
limit 1;

我想请注意,您也可以在没有子查询的情况下执行此操作:

      select latitude, longitude,
             abs(sum(case when date = '2015-08-02' then weight 
                          when date = '2015-08-03' then - weight
                          else 0
                      end) ) as diff
      from points p
      where date in ('2015-08-02', '2015-08-03')
      group by latitude, longitude
      order by diff desc
      limit 1;

另外,我正在使用abs(),因为你的问题表明你只关心差异的大小,而不是方向。