1

テーブルのグループごとに最初のレコードのコピーを (少し変更して) 挿入したいと思います。「with」ステートメントとパーティションの行番号を使用して、グループごとの完全な最初のレコードを取得できます。

     with rankedByTime_PerInteraction as(
SELECT
    ROW_NUMBER() over(PARTITION By displayId, ObjectId, InteractionId order by AssetLog.Recorded Desc) as timeRank,         
    CasLog.*


    FROM         AssetLog INNER JOIN CasLog ON AssetLog.Id = CasLog.ID 
        where   FixType > 0
    )   
select newId()
           ,EVENTCOUNT
           ,PROTOCOLVERSION
           ,EVENTLOOKUPSET
           ,2000
           ,DISPLAYSERIAL
           ,DISPLAYID
           ,MACHINETYPE
           ,GEAR
           ,RF_NODE
           ,OBJECTSERIAL
           ,OBJECTRSSILEVEL
           ,OBJECTSTATUS
           ,OBJECTID
           ,OBJECTINFO
           ,CASTIMESTAMP
           ,SPARE1
           ,SPARE2
           ,[CHECKSUM]
           ,ALARMTIME
           ,MINRANGE
           ,EventId
           ,InteractionId
from rankedByTime_PerInteraction    
where timeRank = 1 

これはうまくいきます。ただし、これをステートメントへの挿入で使用したいと思います。

    INSERT INTO [CasLog]
           ([ID]
           ,[EVENTCOUNT]
           ,[PROTOCOLVERSION]
           ,[EVENTLOOKUPSET]
           ,[EVENTNUMBER]
           ,[DISPLAYSERIAL]
           ,[DISPLAYID]
           ,[MACHINETYPE]
           ,[GEAR]
           ,[RF_NODE]
           ,[OBJECTSERIAL]
           ,[OBJECTRSSILEVEL]
           ,[OBJECTSTATUS]
           ,[OBJECTID]
           ,[OBJECTINFO]
           ,[CASTIMESTAMP]
           ,[SPARE1]
           ,[SPARE2]
           ,[CHECKSUM]
           ,[ALARMTIME]
           ,[MINRANGE]
           ,[EventId]
           ,[InteractionId])

with rankedByTime_PerInteraction as(
    SELECT
        ROW_NUMBER() over(PARTITION By displayId, ObjectId, InteractionId order by AssetLog.Recorded Desc) as timeRank,         
        CasLog.*
        FROM         AssetLog INNER JOIN CasLog ON AssetLog.Id = CasLog.ID 
        where   FixType > 0
    )   
select newId()
           ,EVENTCOUNT
           ,PROTOCOLVERSION
           ,EVENTLOOKUPSET
           ,2000
           ,DISPLAYSERIAL
           ,DISPLAYID
           ,MACHINETYPE
           ,GEAR
           ,RF_NODE
           ,OBJECTSERIAL
           ,OBJECTRSSILEVEL
           ,OBJECTSTATUS
           ,OBJECTID
           ,OBJECTINFO
           ,CASTIMESTAMP
           ,SPARE1
           ,SPARE2
           ,[CHECKSUM]
           ,ALARMTIME
           ,MINRANGE
           ,EventId
           ,InteractionId
from rankedByTime_PerInteraction    
where timeRank = 1 

ただし、キーワード「with」の近くで構文が正しくありません。

挿入ステートメント内で with ステートメントを使用することは可能ですか?

そうでない場合、グループごとに最初のレコードのコピーをテーブルに挿入するにはどうすればよいですか?

ありがとう

4

1 に答える 1

1

これを試して:

INSERT INTO [CasLog]
           ([ID]
           ,[EVENTCOUNT]
           ,[PROTOCOLVERSION]
           ,[EVENTLOOKUPSET]
           ,[EVENTNUMBER]
           ,[DISPLAYSERIAL]
           ,[DISPLAYID]
           ,[MACHINETYPE]
           ,[GEAR]
           ,[RF_NODE]
           ,[OBJECTSERIAL]
           ,[OBJECTRSSILEVEL]
           ,[OBJECTSTATUS]
           ,[OBJECTID]
           ,[OBJECTINFO]
           ,[CASTIMESTAMP]
           ,[SPARE1]
           ,[SPARE2]
           ,[CHECKSUM]
           ,[ALARMTIME]
           ,[MINRANGE]
           ,[EventId]
           ,[InteractionId])

select newId()
           ,EVENTCOUNT
           ,PROTOCOLVERSION
           ,EVENTLOOKUPSET
           ,2000
           ,DISPLAYSERIAL
           ,DISPLAYID
           ,MACHINETYPE
           ,GEAR
           ,RF_NODE
           ,OBJECTSERIAL
           ,OBJECTRSSILEVEL
           ,OBJECTSTATUS
           ,OBJECTID
           ,OBJECTINFO
           ,CASTIMESTAMP
           ,SPARE1
           ,SPARE2
           ,[CHECKSUM]
           ,ALARMTIME
           ,MINRANGE
           ,EventId
           ,InteractionId
from (SELECT
        ROW_NUMBER() over(PARTITION By displayId, ObjectId, InteractionId order by AssetLog.Recorded Desc) as timeRank,         
        CasLog.*
        FROM         AssetLog INNER JOIN CasLog ON AssetLog.Id = CasLog.ID 
        where   FixType > 0
    ) AS rankedByTime_PerInteraction
where timeRank = 1

1 行だけ取​​得したい場合は、SELECT TOP 1 newid() を使用できます...

于 2013-06-05T23:50:59.890 に答える