2013-06-05 4 views
1

Я хотел бы вставить копию (с небольшими изменениями) первой записи на группу в таблице. Я могу получить полную первую запись за группу, используя оператор «с» и номер строки над разделом.Как вставить копию верхней строки для каждой группы в Sql

 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 в инструкции insert?

Если нет, то как я могу лучше всего вставить копию первой записи в группу в таблицу?

Благодаря

ответ

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 

, если вы хотите, чтобы получить одну строку только вы можете использовать Select Top 1 NEWID() ...

+0

Если это отвечает на ваш вопрос пометить его как правильный ответ ;) – bksi

Смежные вопросы