使用DATE_FORMAT在mysql中分组

时间:2013-05-23 08:43:43

标签: mysql sql

我在Mysql中编写SQL查询,其结果应按ID和日期进行分组。日期是动态确定的,可以是简单的日期时间字段,也可以是年份,月份或年份的组合。请参阅下面的查询,查看一年中的一周案例;

SELECT t.transactionId, t.transactionDate, t.transactionProcessDate, 
t.status, t.type, t.versionId, t.note, WEEKOFYEAR(t.transactionDate) as CW, 
YEAR(t.transactionDate) as yr, (DATE_FORMAT(t.transactionDate, '%Y-%u')) as tDate
FROM transaction t 
WHERE (t.status = 'A' or t.status = 'N') 
GROUP BY t.transactionId , tDate

我遇到的问题是尝试按tDate进行分组,

GROUP BY t.transactionId , tDate

返回具有相同日期的重复项。

当我通过CW和yr字段将查询更改为分组时,

GROUP BY t.transactionId , CW, yr

我得到了预期的结果,没有重复。

问题DATE_FORMAT生成的字段分组是否有问题,可能导致返回的查询无法重复记录?
我想从查询中完全排除CW和yr这两个字段,因为它们仅用于分组。

1 个答案:

答案 0 :(得分:2)

更新首先,很难说没有看到您的真实数据,但GROUP BY DATE_FORMAT(t.transactionDate, '%Y-%u')工作得很好

SELECT transactionId, 
       DATE_FORMAT(transactionDate, '%Y-%u') tDate
       ...
  FROM transaction
 WHERE status IN('A', 'N') 
 GROUP BY transactionId, tDate

这是 SQLFiddle

旁注:即使MySql允许在SELECT中指定一个不属于GROUP BY的字段(在您的情况下为t.status,t.type等) {1}}这不是一件好事。您需要将聚合函数应用于该字段(MAXMIN ...)。当您执行GROUP BY

时,无法确定地确定要抓取哪个字段的值