繁体   English   中英

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

[英]MySQL find and combine records closest to date range

在这个令人尴尬的小时数中,我在这里读过类似的帖子,但找不到能回答这个问题的帖子。

拥有与此类似的表格[ID为PK /自动,日期为日期字段]

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

我想创建一个查询(最终将是一个存储的proc),在其中我传入两个日期参数“ from”和“ to”,并返回一个按车辆分组的列表,例如(使用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和里程表都不正确。

有什么建议么?

假设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以升序表示记录,则可以提取Odometer的MIN和MAX值,然后将其用于from_table和to_table。 请注意,如果您拥有相同里程表读数的同一辆汽车的两条记录,则会遇到这种麻烦。 要解决的SQL会更大; 而不是为您的from_table和to_table加入table ,您将加入一个保证每辆车返回一条记录的子查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM