SQL решение для этого? - PullRequest
       4

SQL решение для этого?

1 голос
/ 17 октября 2019

Стол автомобиля (Car_id, Cus_id, Модель, Delivery_Date, Reg_No)

      101   1   Yaris - Active  05-Jan-2016 aa-168
      102   1   Yaris           06-Jan-2017 ab-168
      103   2   Fortuner        07-Jan-2017 aa-1111
      104   3   Vios            08-Jan-2017 aa-1234
      105   3   Altis           09-Feb-2017 ab-5555
      106   4   Camry           10-Feb-2016 ab-9999
      107   5   Hilux Revo      11-Feb-2017 aa-6666

Стол обслуживания (Car_id, Service_Date, Service_Amount, Service_Detail)

      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

Моя цель - запросить значение из обеих таблиц, чтобы оно показывало

Намеченная таблица (Model, 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

Как вы видите, служба Last_ будет содержать последнюю дату, когда автомобиль использует службу, а служба Previous_Service будет содержать дату, когда автомобиль использует службу до ее обслуживания. Мой основной шаг - использовать LEFT JOIN между автомобилем и таблицей обслуживания, так как он наклонен к автомобильному столу.

Мой предполагаемый шаг - запросить Car_id и Count (Car_id) и Group By Car_id, так как это будет указывать наномер существования этой машины. После этого используйте номер счетчика, чтобы указать последнюю и вторую последнюю строку этой модели и назначить значение для указанного столбца ... Однако мне нужно перевести это в SQL ....

 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

.................................................. ...................

   SELECT Car_id, Count(Car_id) As No.Times
   From Service
   Group BY Car_id

Мне нужна помощь ...

Ответы [ 3 ]

1 голос
/ 17 октября 2019

Попробуйте вот так ...

 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
                                )
0 голосов
/ 17 октября 2019

используйте row_number(), чтобы получить последовательность service_dates на основе car_id, затем присоединитесь к следующей последовательности.

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 голосов
/ 17 октября 2019

Поставьте это перед вашим первым выбором:

WITH countedservices AS(
  SELECT *, ROW_NUMBER() OVER(PARTITION BY car_id ORDER BY service_date DESC) service_num
  FROM service
)

Теперь вы можете присоединить countedservices к столу машины дважды - один раз с service_num = 1 и один раз с service_num = 2 дляполучить доступ к текущим и предыдущим данным службы соответственно

Не навязывайте эти предикаты в предложении WHERE, если вы используете левое соединение (предположительно, потому что некоторые автомобили не будут обслуживаться), потому что оно преобразует левое соединение. присоединиться к внутреннему соединению. Вместо этого поместите их в предложение ON:

SELECT * 
FROM 
  car c
  LEFT JOIN countedservice cur ON ... AND cur.service_num = 1
  LEFT JOIN countedservice prev ON ... AND prev.service_num = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...