如果我在维修店有一个程序,并且我想在我的RepairOrder表中选择所有的汽车,其中后一个维修单的里程小于前一个维修单的里程,我如何构建那个select语句?
ID VehicleID Mileage RepairDate
01 1 18425 2013-08-13
02 1 28952 2013-02-26
03 2 22318 2012-08-27
04 3 21309 2012-08-07
05 3 16311 2012-02-27
06 3 16310 2012-02-11
07 4 11098 2011-03-23
08 5 21309 2012-08-07
09 5 16309 2012-02-27
10 5 16310 2012-02-11
在本例中,我应该只选择VehicleID 1,因为它的RepairDate大于前一行,但里程小于前一行。同样的车辆也可能有3行,中间日期的里程数为3或5000000,我还需要选择这些VehicleID。
使用LEAD()函数的结果
ID RepairDate Mileage
25 2011-12-23 45934
48 2009-02-26 13
48 2009-04-24 10
71 2011-07-26 31163
71 2015-01-13 65656
发布于 2015-09-04 12:19:28
这是为sql 2014+使用LEAD()函数的好地方。
WITH NextM as (
SELECT
* ,
LEAD(Mileage, 1, null) over (partition by VehicleID order by RepairDate) NextMileage
FROM RepairOrder
)
SELECT *
FROM NextM
WHERE Mileage > NextMileage
我的解决方案会显示所有列,这样您就可以检查哪些行有问题。
此外,我避免使用distinct
,因为正如OP建议的那样,同一辆车可能会有几个错误,这样你就可以看到所有的错误。
发布于 2015-09-04 11:27:08
它的效率不是很高,但您可以进行成对选择
select t1.VehicleID
from table t1, table t2
where t1.VehicleId = t2.VehicleId
AND t1.Mileage > t2.Mileage
AND t1.RepairDate < t2.RepairDate
可能有一个更好的解决方案,因为成对选择变得非常慢,但这应该是按原样工作的。
发布于 2015-09-04 11:27:46
select distinct RO.VehicleID
from RepairOrder RO
where exists(select *
from RepairOrder
where ID != RO.ID
and VehicleID = RO.VehicleID and RepairDate > RO.RepairDate
and Mileage < RO.Mileage);
https://stackoverflow.com/questions/32389564
复制相似问题