Table de voiture (Car_id, Cus_id, Model, Delivery_Date, Reg_No)
SELECT Car_id, Count(Car_id) As No.Times From Service Group BY Car_id
Table de service (Car_id, Service_Date, Service_Amount, Service_Detail)
SELECT Model, Reg_No, Service_Date As Last_Service, Service_Date As Previous_Date FROM Car LEFT JOIN Service ON Car.Car_id = Service.Car_id
Mon objectif est d'interroger la valeur des deux tables afin qu'elle affiche
Table prévue (modèle, Reg_No, Last_Service, Previous_Service)
Yaris-Active aa-168 20-Feb-2016 10-Aug-2016
Yaris ab-168 06-Feb-2017 -
.............................................
Camry aa-9999 20-Dec-2016 15-Aug-2016
Comme vous pouvez voir que le Last_ Service contiendra la dernière date à laquelle la voiture utilise le service tandis que le Previous_Service contiendra la date à laquelle la voiture utilise le service avant son service. Mon pas de base est d'utiliser LEFT JOIN entre la voiture et la table de service car il est penché vers la table de voiture.
Mon étape prévue est d'interroger Car_id et Count (Car_id) et Group By Car_id comme il l'indiquera le nombre d'existence de cette voiture. Après cela, utilisez le nombre de comptage pour indiquer la dernière et la deuxième dernière ligne de ce modèle et désignez la valeur de la colonne spécifiée ... Cependant, je dois traduire cela en SQL ....
101 05-Feb-2016 2565 1000km
101 10-Aug-2016 3400 10000km
101 20-Feb-2016 2100 20000km
102 06-Feb-2017 2565 1000km
103 07-May-2017 3400 10000km
104 08-Feb-2017 2565 1000km
105 09-May-2017 2565 1000km
106 10-Mar-2016 2565 1000km
106 15-Aug-2016 3400 10000km
106 20-Dec-2016 2100 20000km
3 Réponses :
Mettez ceci avant votre première sélection:
SELECT * FROM car c LEFT JOIN countedservice cur ON ... AND cur.service_num = 1 LEFT JOIN countedservice prev ON ... AND prev.service_num = 2
Vous pouvez maintenant joindre countedservices à la table de voiture deux fois - une fois avec service_num = 1 et une fois avec service_num = 2 pour accéder respectivement aux données de service actuelles et précédentes
N'imposez pas ces prédicats dans la clause WHERE si vous ' vous utilisez une jointure gauche (probablement parce que certaines voitures n'auront pas été réparées) car cela convertira la jointure gauche en jointure interne. Mettez-les dans la clause ON à la place:
WITH countedservices AS( SELECT *, ROW_NUMBER() OVER(PARTITION BY car_id ORDER BY service_date DESC) service_num FROM service )
utilisez row_number () pour obtenir la séquence de service_dates basée sur car_id , puis rejoignez la séquence suivante.
select t1.Car_id, t1.Model, t1.Reg_No, t2.Service_Date as Last_Service, t1.Service_Date as Previous_Date
from
(select Car_id, Model, Reg_No, row_number() over (partition by Car_id order by s.Service_Date asc) rn, s.Service_Date
from Car c
inner join Service s on s.Car_id = s.Car_id) as t1
left join
(select Car_id, Model, Reg_No, row_number() over (partition by Car_id order by Service_Date asc) rn, s.Service_Date
from Car c
inner join Service s on s.Car_id = s.Car_id) as t2 on t2.Car_id = t1.Car_id and t2.rn + 1 = t1.rn
Essayez comme ça ...
SELECT Model,
Reg_No,
Service_Date
INTO #Temp_Output_1
FROM Temp_Car Car
JOIN Temp_Service Servic
ON (Car.Car_id = Servic.Car_id)
SELECT Model,
Reg_No,
Service_Date,
(SELECT MAX(Service_Date) FROM #Temp_Output_1 T1 WHERE T1.Reg_No = T2.Reg_No AND T1.Service_Date < T2.Service_Date) AS Prev_Service_Date
FROM #Temp_Output_1 T2
WHERE T2.Service_Date = (
SELECT MAX(Service_Date)
FROM #Temp_Output_1 T3
WHERE T2.Reg_No = T3.Reg_No
)
votre solution est bonne, mais par modal, il n'y a qu'une seule ligne et votre requête renvoie plusieurs lignes pour le même modèle, ce qui est faux.
Utilisez comme ceci .. SELECT Model, Reg_No, Service_Date, (SELECT MAX (Service_Date) FROM # Temp_Output_1 T1 WHERE T1.Reg_No = T2.Reg_No AND T1.Service_Date
Vous pouvez utiliser les fonctions LEAD, LAG pour connaître le dernier service, le service précédent
J'ai compris que l'exigence était qu'il ne veuille qu'un seul record par voiture, avec l'actuel et le précédent. Bien qu'il soit possible de le faire avec lag / lead, il est fastidieux de limiter le nombre de lignes à 1. Plus facile à utiliser rownumber, de cette façon vous pouvez indiquer de quelle ligne vous voulez toutes les données (et même si vous retardez, vous pourriez finir par utiliser numéro de ligne quand même)