0

抱歉标题模棱两可;但我现在不知道如何描述它不同。

我有下表:

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显然是对结果关系而不是子排序。
  • 使用有只是为了陈述一个条件......

我怎样才能写一个查询来做到这一点?

4

4 回答 4

4

手册所述:

服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加ORDER BY子句的影响。结果集的排序发生在选择值之后,并且ORDER BY不影响服务器选择的值。

要获得分组最大值(如您所愿),您需要将分组子查询的结果与您的表连接起来:

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)
于 2012-06-28T11:39:05.637 回答
0

法希姆是对的。分开的日期和时间列使生活变得不必要地困难。不管。

尝试这个。

SELECT IMEI, MAX(STR_TO_DATE(CONCAT(`date`,` `,'`time`)))
  FROM T
 GROUP BY IMEI

您可能不得不费尽心思才能使 MAX/STR/CONCAT 表达式恰到好处。

这是一个汇总查询,用于查找每个 IMEI 项目的最大日期时间。

于 2012-06-28T11:42:04.450 回答
0

看看那个帖子:如何将一个字段的日期与另一个字段的时间结合起来 - MS SQL Server

为此,您可以简单地使用 SQL 语句:

SELECT imei, (date+time) AS datim, [some more fields] FROM yourTable;

然后您可以在虚拟字段 datim 上使用 max、min、distinct。

于 2012-06-28T12:15:40.083 回答
-2

也许你应该同时订购imeidatetime

SELECT * FROM t GROUP BY imei ORDER BY imei, date DESC, time DESC
于 2012-06-28T11:37:29.740 回答