采取这个简单的查询:
SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay
FROM someTable
GROUP BY formatterDay
这将从表中选择每行只有1行的行 如何确保每个日期选择的行是该日期最早的行,而不在FROM中执行有序的子查询?
干杯
答案 0 :(得分:1)
如果您使用的是MySQL,则无法在单个选择中执行您想要的操作。您需要一个内部查询,为每个格式化日期选择最小ID和格式化或其他字段。然后再次将其加入父表,并选择具有最小ID的记录。
在其他数据库(postgresql,oracle,db2)中,有一些窗口函数允许在单个选择中执行此操作(即DENSE_RANK()OVER ...)。
以下是内部查询的示例(您可能已经知道):
SELECT B.formattedDay, A.*
FROM someTable A
JOIN
(
SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay,
MIN(ID) as firstId
FROM someTable I
GROUP BY 1
) B ON (A.ID = B.firstId)
如果需要,更改MIN(someDate)的MIN(ID)及其时间戳。如果可以使用相同的时间戳显示多个记录,则需要执行两次操作。首先获得每天的最短日期,然后是每个最小日期的最低ID。
答案 1 :(得分:0)
我会像这样重写你的查询:
SELECT distinct DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay
FROM someTable
ORDER BY DATE_FORMAT(someDate, '%y-%m-%d')
如果您绝对需要分组(I.E.您使用的是您未向我们展示的汇总功能),请执行以下操作:
SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay
FROM someTable
GROUP BY DATE_FORMAT(someDate, '%y-%m-%d')
ORDER BY DATE_FORMAT(someDate, '%y-%m-%d') -- this is redundant, but you can use another column here