这是一个令人尴尬的小时数,并在这里阅读了类似的帖子,但没有找到一个回答这个问题。
有一个类似于此的表[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和错误的里程表。
有什么建议吗?
答案 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
,你将加入一个保证每辆车返回一条记录的子查询。