Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Anpassung der SQL-Abfrage

; WITH valid_positions AS (
  SELECT MMSI
       , Message_ID
       , "Time"
       , Latitude
       , Longitude
  FROM   dbo.DecodedCSVMessages_Staging
  WHERE  Latitude  > 55
  AND    Latitude  < 85
  AND    Longitude > 50
  AND    Longitude < 141
)
, positions AS (
  SELECT MMSI
       , Message_ID
       , "Time"
       , Latitude
       , Longitude
  FROM   dbo.DecodedCSVMessages_Staging
  WHERE  Message_ID IN (1, 3)
  AND    EXISTS (
           SELECT *
           FROM   valid_positions
           WHERE  valid_positions.MMSI = DecodedCSVMessages_Staging.MMSI
         )
)
, details AS (
  SELECT MMSI
       , Ship_Type
       , Vessel_Name
       , Row_Number() OVER (PARTITION BY MMSI ORDER BY "Time" DESC) As row_num
  FROM   dbo.DecodedCSVMessages_Staging
  WHERE  Message_ID = 5
)
SELECT positions.MMSI
     , positions.Message_ID
     , positions."Time"
     , details.Ship_Type
     , details.Vessel_Name
     , positions.Latitude
     , positions.Longitude
FROM   positions
 INNER
  JOIN details
    ON details.MMSI    = positions.MMSI
   AND details.row_num = 1 -- Limit to "latest" ship details per MMSI

Es wird jetzt ein dritter CTE verwendet.

  1. valid_positions :beliebig Aufzeichnungen, bei denen die Koordinaten Ihren Kriterien entsprechen, für jede Message_ID 2)
  2. positions :alle Datensätze mit Message_ID gleich 1 oder 3 und es gibt einen Eintrag in der entsprechenden MMSI in valid_positions
  3. details :unverändert gegenüber vorher. Zeigt die "neuesten" Schiffsdetails (Message_ID =5)