2016-05-31 68 views

回答

2

您可以使用条件聚合。问题是得到适当的排序和row_number()可以帮助有:

select fieldname, 
     max(case when seqnum = 1 then oldvalue end) as oldvalue, 
     max(case when seqnum = cnt then newvalue end) as newvalue 
from (select t.*, 
      row_number() over (order by id) as seqnum, 
      count(*) over() as cnt 
     from t 
    ) t 
group by fieldname; 
1

假设你的id是和增量INT(即身份)

Declare @Table table (id int,FieldName varchar(25),OldValue varchar(20),NewValue varchar(25)) 
Insert into @Table (id,FieldName,OldValue,NewValue) values 
(1,'MI','M','N'), 
(2,'GENDER','Male','Female'), 
(3,'GENDER','Female','Male'), 
(4,'FIRSTNAME','','J'), 
(5,'FIRSTNAME','J','Joh'), 
(6,'FIRSTNAME','Joh','John'), 
(7,'STATE','','NJ'), 
(8,'COUNTRY','US','USA') 


Select Sequence = min(MinRow) 
     ,A.FieldName 
     ,OldValue = max(case when id=B.MinRow then OldValue else null end) 
     ,NewValue = max(case when id=B.MaxRow then NewValue else null end) 
From @Table A 
Join (Select FieldName,MinRow=min(ID),MaxRow=max(ID) From @Table Group by FieldName) B on A.FieldName=B.FieldName 
Group by A.FieldName 
Order by 1 

返回

Sequence FieldName OldValue NewValue 
1   MI   M   N 
2   GENDER  Male  Male 
4   FIRSTNAME    John 
7   STATE     NJ 
8   COUNTRY  US   USA 

添加序列并按顺序排列如此

1

这应该产生正确的结果使用相当b ASIC SQL:

SELECT 
    mc1.FieldName, 
    mc2.OldValue, -- OldestValue would perhaps be more meaningful 
    mc3.NewValue -- Likewise, NewestValue here. 
FROM (
    SELECT FieldName, MIN(Id) MinId, MAX(Id) MaxId 
    FROM ModelChange 
    GROUP BY FieldName 
) mc1 
INNER JOIN ModelChange mc2 ON mc1.MinId = mc2.Id 
INNER JOIN ModelChange mc3 ON mc1.MaxId = mc3.Id; 

我所做的假设,即您的ID是渐进的,对于一个给定的字段名的最早的值将具有最小ID和最新的值将具有最大编号。

相关问题