2017-06-16 72 views
0

基于如何获得表中的数据我有学生表是这样的:通过版本

enter image description here

最初有2条记录0版本每当我取得了创纪录的任何变化总是在创建表中的新条目与新的记录ID,但相同的student_id和新版本。这是为了版本管理和数据回溯。

现在我运行下面的查询为0版本中获取数据:

SELECT * FROM tblStudent as a 
inner join (
select student_id, max(record_id) as MaxRecordID from tblStudent group by student_id 
) b on a.student_id=b.student_id and a.record_id = MaxRecordID 
where a.version=0 

由于最新reocord将student_id有最大record_id,所以我没有组并获得唯一由具有最大RECORD_ID该记录。

但它给我错了输出。问题是我不能在由student_id分组时有内联连接查询中有version=0条件。

+0

更换#T你为什么组数据,而不是仅仅使用where子句 – ArgeKumandan

+0

请先了解问题。 –

+0

显示你的预期结果是 – dbajtr

回答

0

这就是我所做的。我假设您将版本作为参数传递给查询。

create table #temp1(
recordid int, 
student_id int, 
student_name varchar(5), 
version int 
) 

insert into #temp1 
values(1,1,'aaa',0) 

insert into #temp1 
values(2,2,'bbb',0) 

insert into #temp1 
values(3,3,'ccc',0) 

insert into #temp1 
values(4,1,'aa1',1) 

insert into #temp1 
values(5,1,'aa2',1) 


declare @version int = 0; 

with cte (recordid, student_id) 
as (select max(recordid) , student_id 
     from #temp1 
     where version <= @version group by student_id 
    ) 
select cte.recordId, t.student_id, t.version, t.student_name 
from cte 
inner join #temp1 t on t.recordid = cte.recordid 
+0

你的工作。 @scrobi。 –

0

您可以使用row_number() over (partion by Student_Id order by version)。 看到这个example

CREATE TABLE tblStudent(Record_Id INT, Student_Id INT, Student_Name nvarchar(50) , Version INT) 

INSERT INTO tblStudent(Record_Id, Student_Id, Student_Name, Version) 
VALUES 
(1,1,'aaa',0), 
(2, 2, 'bbb', 0), 
(3,3,'aaa',0), 
(4,1,'aa1',1), 
(5,1,'aa2',2) 

SELECT * 
FROM (
    SELECT *, Row_Number() OVER (PARTITION BY Student_Id ORDER BY Version ASC) Ranking 
    FROM tblStudent 
) sub 
WHERE sub.Ranking = 1 

的选择*应改为

如果你想要最新的版本,你可以使用DESC,而不是ASC。检查执行计划以基于排序添加正确的索引。

0

一个非常简单的方法:

create table #t (record_id int, student_id int, student_name varchar(50), version int) 
insert into #t values 
(1,1,'aaa',0), 
(2,2,'bbb',0), 
(3,3,'ccc',0), 
(4,1,'aa1',1), 
(5,1,'aa2',1) 

select * from #t 

declare @ver int; 
set @ver = 1; --configurable as 0 or 1 

SELECT a.* FROM #t as a 
inner join (
select student_id, max(record_id) as MaxRecordID from #t group by student_id 
) b on a.student_id=b.student_id 
where (
     (@ver = 1 and (a.record_id = b.MaxRecordID)) 
     or 
     (@ver = 0) and (a.version = 0) 
    ) 
order by a.student_id 

与tblStudent

相关问题