0

在我提出问题之前,这里是关于我的数据的信息:

Table Name: dbo.DecodedCSVMessages_Staging
Columns: MMSI, Message_ID, Time, Vessel_Name, Ship_Type, IMO, Dimension_to_Bow, Dimension_to_stern, Dimension_to_port, Dimension_to_starboard, Draught, Longitude, Latitude

我需要创建一个新表。以下是我在表格中需要的内容:

我对所有这些数据感兴趣,但我只需要 1 或 3 的 Message_ID。**问题是,Message_ID 的 1 和 3 **缺少以下内容:(仅适用于 Message_ID 的 5。)

Vessel_Name,  Ship_Type, IMO, 
Dimension_to_Bow, 
Dimension_to_stern,
Dimension_to_port, 
Dimension_to_starboard, 
Draught

对于 Message_ID 的 1 和 3,这些列被标记为 NULL。他们所拥有的只有

Longitude, 
Latitude, 
Time, 
MMSI

(对于Message_ID 等于 5,它们都标记为 NULL

MMSI 是此实例中的主键。Message_ID 的 1、3 和 5 都将具有代表给定船舶的 MMSI 编号。虽然这些 MMSI 会再次出现,因为每艘船都会发出多个类型 1、3 和 5 的消息。所以假设我们有一个 MMSI 210293000,这个数字将与几个不同类型的 Message_ID 一起出现。所以我需要做的是获取所有 1 和 3 的 Message_ID,并将来自 5 的 Message_ID 的信息附加到 1 和 3。因此,列不再为 NULL。

最后但并非最不重要的一点是,我必须只选择 Message_ID 1 和 3 属于以下内容:

Where Latitude > 55 and Latitude <85 and Longitude > 50 and Longitude < 141;

几列的外观示例:

MMSI/ Message_ID /Time/Ship_type/Vessel_Name/Latitude/Longitude

21029300, 3, 2012-06-01, NULL, NULL, 56.528003, 85.233443

21029300, 5, 2012-07-01, 70, RIO_CUBAL, NULL, NULL

2109300, 1, 2012-08-01, NULL, NULL, 57.432345, 131.123343

2109300, 1, 2012-09-01, NULL, NULL, 62.432345, 121.123343

2109300, 1, 2012-09-02, NULL, NULL, 65.432345, 140.123343

21029300, 5, 2012-08-01, 70, RIO_CUBAL, NULL, NULL

根据这些数据,最终结果如下:

21029300, 3, 2012-06-01, 70, RIO_CUBAL, 56.528003, 85.233443

2109300, 1, 2012-08-01, 70, RIO_CUBAL, 57.432345, 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

谢谢!

4

3 回答 3

0

考虑到评论部分的所有信息(特别是关于一次性注意事项),您可以尝试以下 SQL 语句。但是,这只有在“类型 5”消息的相关数据确实如您所说的一致时才有效!

SELECT Messages.MMSI
    ,Messages.Message_ID
    ,Messages.TIME
    ,Type5Messages.Vessel_Name
    ,Type5Messages.Ship_Type
    ,Type5Messages.IMO
    ,Type5Messages.Dimension_to_Bow
    ,Type5Messages.Dimension_to_stern
    ,Type5Messages.Dimension_to_port
    ,Type5Messages.Dimension_to_starboard
    ,Type5Messages.Draught
    ,Messages.Longitude
    ,Messages.Latitude
INTO [DataBaseName].[dbo].[YourNewTableName]
FROM dbo.DecodedCSVMessages_Staging Messages
LEFT OUTER JOIN (
    SELECT DISTINCT MMSI
        ,Vessel_Name
        ,Ship_Type
        ,IMO
        ,Dimension_to_Bow
        ,Dimension_to_stern
        ,Dimension_to_port
        ,Dimension_to_starboard
    FROM dbo.DecodedCSVMessages_Staging
    WHERE Messages.Message_ID = 5
    ) Type5Messages
    ON Messages.MMSI = Type5Messages.MMSI
WHERE Messages.Message_ID IN (1,3)
    AND Messages.Latitude > 55
    AND Messages.Latitude < 85
    AND Messages.Longitude > 50
    AND Messages.Longitude < 141;

在此语句中,您选择所有“type 1”和“type 3”行并将它们与所有具有相同MMSI值的“type 5”行连接起来。如果所选列的“类型 5”信息一致,则每个“类型 5”行将只有一个条目,因此每个“类型 1”和“类型 3”行将只出现一次。不过,您绝对应该做一些测试。
INTO [DataBaseName].[dbo].[YourNewTableName]行(您必须在命名方面进行调整)使用原始表的数据类型创建一个新表(如果您选择尚未使用的名称)并插入选定的行。如果您需要索引、键、关系或其他任何内容,您可能希望稍后更改此表。

于 2013-09-16T14:52:02.777 回答
0

在单个事务中,创建新表,用于INSERT INTO ... SELECT ...将数据从 传输DecodedCSVMessages_Staging到新表,然后DELETE FROM ...从 中删除旧数据DecodedCSVMessages_Staging

于 2013-09-16T13:10:47.607 回答
0

您可以选择类型 1 和类型 3 消息,并添加来自数据中第一个对应类型 5 记录的连接信息。(如果没有对应的类型 5 记录,您将得到这些字段的空值。)试试这个:

SELECT DISTINCT M13.MMSI, M13.Message_ID, M13.Time, M13.Latitude, M13.Longitude,
M5.Vessel_Name, M5.Ship_Type, M5.IMO, M5.Dimension_to_Bow
M5.Dimension_to_stern, M5.Dimension_to_port, 
M5.Dimension_to_starboard, M5.Draught
FROM dbo.DecodedCSVMessages_Staging M13
JOIN (
SELECT MMSI, Time, Vessel_Name, Ship_Type, IMO, Dimension_to_Bow
Dimension_to_stern, Dimension_to_port, Dimension_to_starboard, 
Draught
FROM dbo.DecodedCSVMessages_Staging
WHERE Message_ID = 5
ORDER BY Time
) M5
ON M5.MMSI = M13.MMSI
WHERE M13.Message_ID IN (1, 3)
AND M13.Latitude > 55
AND M13.Latitude < 85
AND M13.Longitude > 50
AND M13.Longitude < 141
ORDER BY M13.Time

如果这返回您想要的数据,则创建一个新表并使用INSERT INTO NewTable SELECT插入记录。

请注意,无论是在旧表中还是在新表中,MMSI 都不是主键。主键 (PK) 必须是唯一的,在这种情况下,每个 MMSI 都有多个条目。

创建新表时,应添加一个整数 IDENTITY 字段,以便它具有 PK。这个 IDENTITY 字段不包含在插入语句中,但它会自动填充一个递增的整数。这样每条记录都会获得一个独特的 PK,这是非常可取的。

编辑DISTINCT以在外部查询上使用 a 。

于 2013-09-16T14:39:15.160 回答