表中5个最新行的聚合函数(SUM)

时间:2012-12-15 00:11:31

标签: sql

这是一个令人困惑的SQL问题(至少对我而言)涉及GROUP BY和AGGREGATES ...会喜欢任何帮助。

我在一个记录有关骑自行车和骑车的信息的网站上工作。我们有一张桌子,其中包含骑手ID,骑行日期和骑行距离。我想要显示一张表格,其中包含最新的游乐设施,距离以及每位骑手的总距离。这是我的sql和输出(其中id是rider id):

+--------+---------------------+----------+
| id     | dated               | distance |
+--------+---------------------+----------+
| 101240 | 2012-11-30 00:00:00 |      250 |
| 101332 | 2012-11-22 00:00:00 |       31 |
| 101313 | 2012-11-21 00:00:00 |       15 |
| 101319 | 2012-11-21 00:00:00 |       25 |
| 101320 | 2012-11-21 00:00:00 |       56 |
+--------+---------------------+----------+

这很容易获得:

SELECT id, dated, distance FROM rides ORDER BY dated LIMIT 5

我似乎无法弄清楚这些最近的游乐设施是否会让骑手累积总数...基本上:

SELECT sum(distance) FROM rides GROUP BY id

是否可以在SQL中处理所有这些而无需执行某些程序化操作?我已经尝试过做一些子查询和JOINS但是没有用!

先谢谢SO社区。

2 个答案:

答案 0 :(得分:1)

Duh,我应该更了解我的数据模式。我一直在尝试使用错误的id列,这实际上是一个序列化的行ID,而不是一个车友ID。 SQL的工作版本(在MYSQL上)是:

SELECT r.rider, rr.dated, rr.distance, i.firstname, i.lastname, sum(r.distance) 
FROM rides r
INNER JOIN (SELECT rider, distance, dated FROM rides ORDER BY dated DESC LIMIT 5) rr ON r.rider = rr.rider 
INNER JOIN riders i ON r.rider = i.id 
GROUP BY r.rider ORDER BY rr.dated DESC;

返回:

+-------+---------------------+----------+-----------+----------+-----------------+
| rider | dated               | distance | firstname | lastname | sum(r.distance) |
+-------+---------------------+----------+-----------+----------+-----------------+
|  3304 | 2012-11-30 00:00:00 |      250 | venkatesh | ss       |             250 |
|   647 | 2012-11-22 00:00:00 |       31 | ralph     | suelzle  |           22726 |
|  2822 | 2012-11-21 00:00:00 |       15 | humberto  | calderon |           10421 |
|  2339 | 2012-11-21 00:00:00 |       25 | Judy      | Rutter   |            8545 |
|  1452 | 2012-11-21 00:00:00 |       56 | Fred      | Stearley |           64366 |
+-------+---------------------+----------+-----------+----------+-----------------+

感谢您的回答!

答案 1 :(得分:0)

这样的事情会起作用吗?顺便说一下,sql server正在使用什么?

SELECT sum(distance) 
FROM (SELECT distance FROM rides ORDER BY dated DESC LIMIT 5)