2014-10-17 33 views
0

我有SQL表数据设置如下转换SQL数据集

SheetNo VersioId ColumnId Value 
    Sheet1 1  column1  3 
    Sheet1 3  column1  7 
    Sheet1 1  column2  A 
    Sheet1 1  column3  Z 
    Sheet1 4  column3  T 
    Sheet1 1  column5  R 
    Sheet1 2  column5  Q 

我想写一个SQL查询来改造这个数据集如下

SheetNo VersioId ColumnId Value 
Sheet1 3  column1  7 
Sheet1 1  column2  A 
Sheet1 4  column3  T 
Sheet1 2  column5  Q 

我真正需要的是让每个其最大版本ID的列值。可有一个人帮我在这

+0

要保留原始数据,或删除所有,但每个“欺骗”“最大”的版本? '选择sheetno,versioid,ColumnID的,最大(值)... GROUP BY sheetno,versioid,columnid'? – 2014-10-17 17:23:15

+0

我不想删除。我只需要一个选择查询 – udaya726 2014-10-17 17:24:50

+0

你能解释为什么你会返回'Sheet1 1 column2 A' for VersionId = 1吗?为什么不'Sheet1 1 column5 R'还是不重要? – Tak 2014-10-17 17:26:40

回答

2

这可能会帮助您:

select y1.* from YourTable y1 
join 
(select Columnid,max(versionid) versionid from YourTable 
group by Columnid) as y2 
on y1.Columnid = y2.Columnid and y1.versionid = y2.versionid 
+0

我应该更加严格。根据查询计划,您当然会执行我的工作。 – 2014-10-17 17:42:25

1

从本质上讲,从基表得到您的SheetNo和ColumnID的,然后过适用于抢VersioId和价值上的VersioId。将结果分组以折叠行,然后根据您的喜好进行排序。相同的结构可以用于通过一些不同的列的最大抓住其它数据。见SqLFiddle example

select A.SheetNo, B.VersioId, A.ColumnId, B.Value 
from Sheets A 
    cross apply (
    select top 1 VersioId, Value 
    from Sheets C 
    where C.SheetNo = A.SheetNo 
     and C.ColumnId = A.ColumnId 
    order by C.VersioId desc 
    ) B 
group by A.SheetNo, B.VersioId, A.ColumnId, B.Value 
order by A.SheetNo, A.ColumnId