对于含糊不清的标题感到抱歉;但我现在不知道如何描述它不同。
我有下表:
imei | date | time | some more fields
345 | 2012-06-28 | 07:18 | .....
345 | 2012-06-28 | 07:20 | .....
345 | 2012-06-28 | 07:21 | .....
987 | 2012-06-28 | 07:19 | .....
etc etc
我希望得到最新一排非常独特的imei,所以:
345 | 2012-06-28 | 07:21
987 | 2012-06-28 | 07:19
SELECT * FROM t GROUP BY imei
会导致使用第一行而不是最后一行。 time
排序显然会命令结果关系而不是子。如何编写查询来执行此操作?
答案 0 :(得分:4)
如the manual中所述:
服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加
ORDER BY
子句不会影响每个组中值的选择。选择值后会对结果集进行排序,ORDER BY
不会影响服务器选择的值。
要获得groupwise maximum(如您所愿),您需要将分组子查询的结果与您的表联系起来:
SELECT * FROM t JOIN (
SELECT imei, MAX(ADDTIME(date, time)) AS dt FROM t GROUP BY imei
) AS u ON t.imei = u.imei AND t.date = DATE(u.dt) AND t.time = TIME(u.dt)
答案 1 :(得分:0)
法希姆是对的。分隔的日期和时间列使生活变得不必要地困难。无论如何。
试试这个。
SELECT IMEI, MAX(STR_TO_DATE(CONCAT(`date`,` `,'`time`)))
FROM T
GROUP BY IMEI
你可能不得不将MAX / STR / CONCAT表达式恰到好处。
这是一个摘要查询,用于查找每个IMEI项目的最大日期时间。
答案 2 :(得分:0)
看一下那篇文章:How to combine date from one field with time from another field - MS SQL Server
为此,您只需使用SQL语句:
SELECT imei, (date+time) AS datim, [some more fields] FROM yourTable;
然后你可以在虚拟场datim上使用max,min,distinct。
答案 3 :(得分:-2)
也许您应该同时按imei
和date
,time
订购:
SELECT * FROM t GROUP BY imei ORDER BY imei, date DESC, time DESC