SQL AdvancedQuery

dpa*_*alm 3 sql sql-server-2008

我在名为dbo.DecodedCSVMessages_Staging的表中有以下数据

以下是数据示例:

MMSI     Message_ID    Time     Ship_Type  Vessel_Name   Latitude   Longitude

2102930      3       2012-06-01     NULL      NULL       56.528003  85.233443

2102930      5       2012-07-01      70     RIO_CUBAL      NULL      NULL

2109300      1       2012-08-01     NULL      NULL       57.43234   131.123343

2109300      1       2012-09-01     NULL      NULL       62.432345  121.123343

2109300      1       2012-09-02     NULL      NULL       65.432345  140.123343

2109300      5       2012-08-01      70     RIO_CUBAL      NULL       NULL

2225555      1       2012-08-01     NULL      NULL       66.432345  143.123343

2225555      1       2012-09-01     NULL      NULL       25.432345  145.123343

2225555      5       2012-08-01      70      RIO_II        NULL       NULL
Run Code Online (Sandbox Code Playgroud)

我需要的是如下:

  • MMSI号码是代表船舶的唯一号码.船舶以独特的消息类型发送不同的信息.我只对Message_ID 1和3感兴趣,因为他们有纬度和纵向信息.MMSI将在此数据库中重新进行复制(如上面的数据所示)
  • 问题是,我需要有关船只的信息,遗憾的是只能在Message_ID 5中使用.例如Vessel_name和Ship_type.
  • 我只需要属于下列经度和纬度的船只

  • Ship_Type可能会改变!在这种情况下,它必须反映较晚的日期

    纬度> 55,纬度<85,经度> 50,经度<141;

查询数据的结果将产生以下结果(当我使用此信息在ArcGIS中构建点要素时,我将保存为CSV格式)

MMSI     Message_ID    Time    Ship_Type  Vessel_Name   Latitude   Longitude

2102930      3       2012-06-01     70     RIO_CUBAL    56.528003  85.233443

2109300      1       2012-08-01     70     RIO_CUBAL    57.43234   131.123343

2109300      1       2012-09-01     70     RIO_CUBAL    62.432345  121.123343

2109300      1       2012-09-02     70     RIO_CUBAL    65.432345  140.123343

2225555      1       2012-08-01     70      RIO_II      66.432345  143.123343
Run Code Online (Sandbox Code Playgroud)
  • 所以所有Message_ID 5都消失了

  • 倒数第二行消失了(因为纬度仅为25.432345)

  • 通过使用MMSI进行链接,已将信息Ship_Type和Vessel_Name添加到Message_ID 1和3中.

制约因素:

  1. 无法创建新表(没有访问权限)
  2. 此数据库中有超过十亿行数据(但只有大约430万行符合纬度/经度限制)

可能是什么?谢谢!

gve*_*vee 5

这样的事情应该这样做:

; WITH positions AS (
  SELECT MMSI
       , Message_ID
       , "Time"
       , Latitude
       , Longitude
  FROM   dbo.DecodedCSVMessages_Staging
  WHERE  Message_ID IN (1, 3)
  AND    Latitude  > 55
  AND    Latitude  < 85
  AND    Longitude > 50
  AND    Longitude < 141
)
, 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
Run Code Online (Sandbox Code Playgroud)