我有下表
Date, TelephoneNumber, Type
02/02/12, 123456, b
04/02/12, 123456, b
07/02/12, 123456, a
03/02/12, 789999, a
15/02/12, 789999, b
运行以下SQL
时 select TelephoneNumber, max(Date) as datetime, Type
from Table1
where Date > '2012-03-25 00:00'
group by TelephoneNumber
order by date desc;
我注意到Type与其相关的Date不匹配。例如,我正在
07/02/12, 123456, b
15/02/12, 789999, a
它似乎是在Type中取得第一条记录....即使我在另一方面排序。有人可以帮我解决这个问题吗?我正在使用MySQL
提前致谢。 桑德罗
答案 0 :(得分:3)
这个问题似乎经常出现。
这是我的解决方案:
SELECT TelephoneNumber, Date AS datetime, Type
from ( SELECT *
FROM Table1
WHERE Date > '2012-03-25 00:00'
ORDER BY Date DESC) AS h
GROUP BY TelephoneNumber
ORDER BY date DESC;
答案 1 :(得分:2)
这是因为,正如§11.16.3 "GROUP BY
and HAVING
with Hidden Columns" in the MySQL 5.6 Reference Manual所说:
MySQL扩展了
GROUP BY
的使用范围 select list可以引用未在其中命名的非聚合列GROUP BY
条款。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序获得更好的性能 和分组。但是,这主要适用于所有值 在GROUP BY
中未命名的每个非聚合列中,每个组都是相同的。 服务器是免费的 从每个组中选择任何值,因此除非它们相同, 选择的值是不确定的。此外,选择 每组的值不能通过添加来影响ORDER BY
条款。对结果集进行排序 选择值后发生,ORDER BY
不影响服务器选择的值。
[强调我的]
相反,你需要写这样的东西:
select t1a.TelephoneNumber, t1a.Date, t1a.Type
from Table1 as t1a
left
join Table1 as t1b
on t1b.TelephoneNumber = t1a.TelephoneNumber
and t1b.Date > t1a.Date
where t1a.Date > '2012-03-25 00:00'
and t1b.TelephoneNumber IS NULL -- i.e., the join failed
;
为Date
的每个值找到TelephoneNumber
最大的记录。
答案 2 :(得分:0)
分组后应用订单。已经计算了max(Date)的值,你没有以任何方式对它进行排序。另外,msisdn
是什么?无法判断您的查询是什么,因为您实际分组的内容是不透明的。