sql >> Database >  >> RDS >> Sqlserver

Aanpassing SQL-query

; 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

Er wordt nu een 3e CTE gebruikt.

  1. valid_positions :elke registreert waar de coördinaten aan uw criteria voldoen, voor elke Message_ID 2)
  2. positions :alle records waar Message_ID is gelijk aan 1 of 3 en er is een record in de corresponderende MMSI in valid_positions
  3. details :ongewijzigd ten opzichte van voorheen. Toont de "laatste" details van het schip/vaartuig (Message_ID =5)


  1. Hoe items uit deze relatie selecteren?

  2. Doctrine QueryBuilder:ManyToOne-relatie waarbij meer dan één subEntiteit moet overeenkomen

  3. Backticks gebruiken rond veldnamen

  4. Android studio getSlotFromBufferLocked:onbekende bufferfout