1
votes

Solution SQL à cela?

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


2 commentaires

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)


3 Réponses :


0
votes

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
)


0 commentaires

0
votes

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


0 commentaires

0
votes

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
                                )


2 commentaires

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