sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-frågajustering

; 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

Det finns nu en tredje CTE som används.

  1. valid_positions :alla poster där koordinaterna passar dina kriterier, för valfri Message_ID 2)
  2. positions :alla poster där Message_ID är lika med 1 eller 3 och det finns en post i motsvarande MMSI i valid_positions
  3. details :oförändrad från tidigare. Visar de "senaste" fartygs-/fartygsdetaljerna (Message_ID =5)


  1. MySQL PÅ DUBLIKATNYCKEL - senaste infognings-id?

  2. Hur får man åtkomst till mysqli-anslutning i en annan klass på en annan sida?

  3. Hur man skapar främmande nyckelbegränsningar med ON DELETE SET NULL-alternativet i SQL Server - SQL Server / TSQL Tutorial Del 81

  4. Hur man gör sql-mode=NO_ENGINE_SUBSTITUTION permanent i MySQL my.cnf