2015-01-14 125 views
0

在這個令人尷尬的小時數裏,在這裏閱讀過類似的帖子,但沒有找到一個回答這個問題的記錄。MySQL查找和合並最接近日期範圍的記錄

具有類似於此的表[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 

我想創建一個查詢(最終將成爲一個存儲過程)其中,I通過在兩個日期參數,「從」和「to」,並把它返回(使用14年1月1日和14年1月31日作爲日期參數例如)通過車輛這樣分組的列表:

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結合日期< =但沒有得到數據排列我怎麼需要它。

例如:

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

以日期存儲日期,然後回來給我們 – Strawberry

回答

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表示升序日期順序,那麼你就可以提取里程錶的最小值和最大值,並用它來記錄加入from_table和to_table。請注意,如果您對具有相同里程錶讀數的相同車輛有兩條記錄,您將遇到麻煩。要應對這個問題的SQL會更大;而不是加入到table爲您from_table和to_table,您將加入一個子查詢,保證每輛車返回一個記錄。

+0

工作就像一個魅力,謝謝! – TransitDataHead