简体   繁体   中英

SQL join with previous row from the same group

I have a problem with sql query. I'm trying to create one time script which will put data to table. I have temporary table of new values ordered by date and i'm going to search previous value which have to have the same GroupId, TransactionId and FieldTypeId but ClaimModificationId have to be smaller.

Below i write a script which would be good if not error throwing on line:

where m2.ClaimModificationId < m1.ClaimModificationId

sql does not allow do referer to m1 table. Is there a method to write that condition differently?

create table #modifications (
  [ClaimModificationId] INT IDENTITY(1,1),
  [GroupId] INT,
  [FieldTypeId] INT,
  [FieldName] NVARCHAR(255),
  [TransactionId] INT,
  [NewValue] NVARCHAR(255),
  [UserEmail] NVARCHAR(255),
  [ModificationDate] DATETIME,
  [Action] NVARCHAR(50))

select top 10 
     m1.[GroupId], 
     m1.[FieldTypeId], 
     m1.[FieldName], 
     m1.[TransactionId], 
     cm4.[NewValue] as OldValue, 
     m1.[NewValue], 
     m1.[UserEmail], 
     m1.[ModificationDate], 
     m1.[Action]
from #modifications m1 
left join (
     select max(m2.ClaimModificationId) as ClaimModificationId, m2.[GroupId], m2.[FieldTypeId], m2.TransactionId 
     from #modifications m2
     where m2.ClaimModificationId < m1.ClaimModificationId
     group by m2.GroupId, m2.FieldTypeId, m2.TransactionId) m3 
on m3.groupId = m1.GroupId and m3.FieldTypeId = m1.FieldTypeId and m3.TransactionId = m1.TransactionId
LEFT JOIN #modifications cm4 ON m3.ClaimModificationId = cm4.ClaimModificationId 

Try with OUTER APPLY :

SELECT TOP 10
        m1.[GroupId] ,
        m1.[FieldTypeId] ,
        m1.[FieldName] ,
        m1.[TransactionId] ,
        cm4.[NewValue] AS OldValue ,
        m1.[NewValue] ,
        m1.[UserEmail] ,
        m1.[ModificationDate] ,
        m1.[Action]
FROM    #modifications m1
        OUTER APPLY ( SELECT    MAX(m2.ClaimModificationId) AS ClaimModificationId ,
                                m2.[GroupId] ,
                                m2.[FieldTypeId] ,
                                m2.TransactionId
                      FROM      #modifications m2
                      WHERE     m2.ClaimModificationId < m1.ClaimModificationId
                                AND m2.groupId = m1.GroupId
                                AND m2.FieldTypeId = m1.FieldTypeId
                                AND m2.TransactionId = m1.TransactionId
                      GROUP BY  m2.GroupId ,
                                m2.FieldTypeId ,
                                m2.TransactionId
                    ) m3
        LEFT JOIN #modifications cm4 ON m3.ClaimModificationId = cm4.ClaimModificationId 

you can try something like this

create table #modifications
(
  [ClaimModificationId] INT IDENTITY(1,1),
  [GroupId] INT,
  [FieldTypeId] INT,
  [FieldName] NVARCHAR(255),
  [TransactionId] INT,
  [NewValue] NVARCHAR(255),
  [UserEmail] NVARCHAR(255),
  [ModificationDate] DATETIME,
  [Action] NVARCHAR(50)
)

INSERT INTO #modifications values(1,1,'field',2,'new val1','email@email.com',GETDATE(),'inserted')
INSERT INTO #modifications values(1,2,'field',2,'val1','email@email.com',GETDATE(),'inserted')
INSERT INTO #modifications values(2,1,'field',3,'val2','email@email.com',GETDATE(),'inserted')
INSERT INTO #modifications values(1,1,'field',2,'val3','email@email.com',GETDATE(),'inserted')
INSERT INTO #modifications values(1,1,'field',2,'val4','email@email.com',GETDATE(),'inserted')
INSERT INTO #modifications values(1,1,'field',2,'val5','email@email.com',GETDATE(),'inserted')
INSERT INTO #modifications values(2,1,'field',3,'val5','email@email.com',GETDATE(),'inserted')

SELECT TOP 10 
     m1.[GroupId], 
     m1.[FieldTypeId], 
     m1.[FieldName], 
     m1.[TransactionId], 
     LAG([NewValue]) OVER(PARTITION by GroupId, FieldTypeId, TransactionId ORDER BY ClaimModificationId ASC) as OldValue, 
     m1.[NewValue], 
     m1.[UserEmail], 
     m1.[ModificationDate], 
     m1.[Action]
from #modifications m1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM