MySQL查找并组合最接近日期范围的记录

时间:2015-01-14 20:01:39

标签: mysql

这是一个令人尴尬的小时数,并在这里阅读了类似的帖子,但没有找到一个回答这个问题。

有一个类似于此的表[ID是PK / Auto,Date是日期字段]

ID, Date, Vehicle, Odometer
1, 1/7/14, A16, 55512
2, 1/9/14, A16, 55600
3, 1/10/14, A16, 55600
4, 1/29/14, A16, 56213
5, 1/4/14, A17, 99512
6, 1/12/14, A17, 99600
7, 1/16/14, A17, 99600
8, 1/22/14, A17, 99213

我想创建一个查询(最终将是一个存储过程),我传入两个日期参数,"来自"并且"到",并返回按车辆分组的列表(例如使用1/1/14和1/31/14作为日期参数):

Vehicle, From_ID, From_Date, From_Odometer, To_ID, To_Date, To_Odometer
A16, 1, 1/7/14, 55512,  4, 1/29/14, 56213
A17, 5, 1/4/14, 99512, 8, 1/22/14, 99213

尝试了多个查询,子查询,带有DATEDIFF和MAX的视图以及Date< =但是没有按照我需要的方式排列数据。

例如:

select 
table.ID
, max(table.`Date`) as TheDate
, table.Odometer
FROM table
where table.Odometer > 0 
and table.`Date`<= str_to_date('2/1/14','%m/%d/%Y');

尝试获取我需要的部分,但会产生正确的日期,但错误的ID和错误的里程表。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

假设Date实际上是一个日期类型,并且该ID是自动递增主键,并且在里程表检查发生的日期输入数据(因此您可以推断出ID越早,越早日期和里程表读数),然后这应该工作:

SELECT
    from_to.Vehicle,
    from_table.ID       AS From_ID,
    from_table.Date     AS From_Date,
    from_table.Odometer AS From_Odometer,
    to_table.ID         AS To_ID,
    to_table.Date       AS To_Date,
    to_table.Odometer   AS To_Odometer
FROM (
    SELECT
        vehicle,
        MIN(ID) AS From_ID,
        MAX(ID) AS To_ID
    FROM
        `table`
    WHERE
        Date BETWEEN '2014-01-01' AND '2014-01-31'
    GROUP BY 1
) from_to
INNER JOIN `table` from_table
    ON from_table.ID = from_to.From_ID
INNER JOIN `table` to_table
    ON to_table.ID = from_to.To_ID

如果你不能假设ID代表按日期升序排列的记录,那么你可以提取里程表的MIN和MAX值并使用它来加入from_table和to_table。请注意,如果您对具有相同里程表读数的同一车辆有两条记录,则会遇到麻烦。处理这个问题的SQL会更大;而不是为你从from_table和to_table加入table,你将加入一个保证每辆车返回一条记录的子查询。