这个问题在这里已经有答案了:
sql仅选择列上具有最大值的行[重复](27个答案)
两年前关门了。
我想执行一个查询,只从给定的组中选择最近的项。
在这个例子中,我跟踪货车:
每次他们回到基地 check-in
记录信息-里程等。。。
每次他们送货时 delivery
已记录-客户等。。。
这张表让我们知道一个给定的历史 van
. 数据可以通过查询生成,也可以在运行时存储—这不是问题所在。
id | checkin_id | delivery_id | van_id
----+------------+-------------+--------
24 | 15 | NULL | 3
25 | NULL | 28 | 3
26 | 16 | NULL | 4
27 | NULL | 29 | 3
28 | NULL | 30 | 4
29 | 17 | NULL | 5
我可以通过查询查看货车的历史 ... WHERE van_id=3;
-好吧。
相反,我希望能够得到 vans
他们最近的“事件”。因此:
id | checkin_id | delivery_id | van_id
----+------------+-------------+--------
27 | NULL | 29 | 3
28 | NULL | 30 | 4
29 | 17 | NULL | 5
我跳转到以下问题:
SELECT * FROM `history` GROUP BY `van_id`;
但这会返回以下错误:
1055-select list的表达式#1不在group by子句中,并且包含未聚合的列“database.history.checkin_id”,该列在功能上不依赖于group by子句中的列;这与sql\u mode=only\u full\u group by不兼容
读完之后,我明白了这是怎么回事,不得不承认我的sql有些过时了—我想从组中返回哪些项?
添加 checkin_id
以及 delivery_id
到 GROUP BY
只是转移了问题-最终我得到了相同的数据集,只是排序不同。
这个答案激起了我的兴趣,图片确实有助于清晰地勾勒出问题的轮廓,谢谢@azerafati!
我想使用 FIRST()
或者 LAST()
聚合函数-但mysql似乎没有。
如何在不处理应用程序中所有数据的情况下重现这种行为?
2条答案
按热度按时间gz5pxeao1#
我猜你的
id
值是唯一的,以后的记录比以前的记录具有更高的值。您需要使用一个子查询来获取最新的
id
对于每辆货车:然后将其加入到详细信息查询中。
但是因为id值是唯一的,所以可以进一步简化。
ubbxdtey2#
我本来打算把这个标记为重复的,因为这个问题实际上被问得相当频繁,但我发现那些问题/答案似乎很难找到;下面是通用模板:
在你的特殊情况下最低是最小(id)…哦,哎呀;你的问题说的是第一个,但细节说的是最近的(我将解释为最后一个),所以只需使用max而不是min…“groupingvalue”是vanïid。
编辑:如果在分组字段和用于标识最低/第一/最高/最近字段的字段上有索引,则查询应该相当有效。