通过版本
问题描述:
基于如何获得表中的数据我有学生表是这样的:通过版本
最初有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
条件。
答
这就是我所做的。我假设您将版本作为参数传递给查询。
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。 –
答
您可以使用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
。检查执行计划以基于排序添加正确的索引。
答
一个非常简单的方法:
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
更换#T你为什么组数据,而不是仅仅使用where子句 – ArgeKumandan
请先了解问题。 –
显示你的预期结果是 – dbajtr