J'ai ce tableau:

id | PlateNumber |  ImgDate |    ImgTime|
1  | abc123 |      2020-03-01 |  09:10:33|
2  | qwe128 |      2020-03-02|   09:13:39|
3  | abc123 |      2020-03-01|   09:11:21|

Il y a donc trop de numéros de plaques répétés en fonction du temps de capture d'image. J'ai besoin d'une instruction select qui renvoie des enregistrements répétés uniquement lorsqu'il y a un décalage horaire de plus de 3 minutes. J'espère que cela a du sens. S'il vous plaît aider Merci les gars!

0
Tony Fares 24 avril 2020 à 10:54

2 réponses

Meilleure réponse

Vous devez fournir un peu plus d'informations, mais vous voudrez comparer la ligne actuelle avec la précédente (pour chaque PlateNumber). Vous pouvez le faire en utilisant une fonction analytique comme LAG.

WITH CTE as (
Select 
  id
  ,PlateNumber
  ,ImgDate
  ,ImgTime
  ,LAG(ImgDate) OVER (PARTITION BY PlateNumber ORDER BY ImgDate,ImgTime) as PreviousDate
  ,LAG(ImgTime) OVER (PARTITION BY PlateNumber ORDER BY ImgDate,ImgTime) as PreviousImgTime
FROM YourTable
)
Select id
  ,PlateNumber
  ,ImgDate
  ,ImgTime
FROM CTE
  WHERE (PreviousDate is null and PreviousImgTime is null) -- to keep the first occurence
  OR ( 
      DATEDIFF(second,
         DATEADD(day, 0, DATEDIFF(day, 0, PreviousDate)) + DATEADD(day, 0 - DATEDIFF(day, 0, PreviousImgTime), PreviousImgTime) ,
         DATEADD(day, 0, DATEDIFF(day, 0, ImgDate)) + DATEADD(day, 0 - DATEDIFF(day, 0, ImgTime), ImgTime) 
         ) > 180
      )  

Si vos colonnes sont de type DATE et TIME

 OR ( 
          DATEDIFF(second,
            cast(PreviousDate as DATETIME) +cast(PreviousImgTime as DATETIME) ,
            cast(ImgDate as DATETIME) + cast(ImgTime as DATETIME), 
            ) > 180
          )  
0
Gabriel Durac 24 avril 2020 à 09:55

Dans SQL Server, vous pouvez ajouter des valeurs datetime, vous pouvez donc le faire simplement avec lag():

select t.*
from (select t.*, v.dt,
             lag(dt) over (partition by platenumber order by dt) as prev_dt
      from t cross apply
           (values (convert(datetime, t.imgdate) + convert(datetime, t.imgtime))
           ) as v(dt)
     ) t
where prev_dt is null or prev_dt < dateadd(minute, -3, dt);
0
Gordon Linoff 24 avril 2020 à 11:55