我有这个表结构:
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
提前致谢!
答案 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()
,因为你的问题表明你只关心差异的大小,而不是方向。