SQL-创建每个组最后一行的视图(大型数据集)

SQL-创建每个组最后一行的视图(大型数据集),sql,sql-server,select,view,Sql,Sql Server,Select,View,所以我应该创建一个基于大型数据集中每个组的最后一行的视图 (33918340行)因此性能是关键问题。例如,从营业额表中获取每个银行账户的最后营业额。我用的是 SELECT t1.* FROM turnover t1 LEFT JOIN turnover t2 ON (t1.bankaccnumber = t2.bankaccnumber AND t1.id < t2.id) WHERE t2.id IS NULL; 选择t1* 从营业额t1向左加入营业额t2 打开(t1.bankac

所以我应该创建一个基于大型数据集中每个组的最后一行的视图 (33918340行)因此性能是关键问题。例如,从营业额表中获取每个银行账户的最后营业额。我用的是

SELECT t1.*
FROM turnover t1 LEFT JOIN turnover t2
ON (t1.bankaccnumber = t2.bankaccnumber AND t1.id < t2.id)
WHERE t2.id IS NULL;  
选择t1*
从营业额t1向左加入营业额t2
打开(t1.bankaccnumber=t2.bankaccnumber和t1.id
性能不是很好,我后来不得不添加与客户相关的附加连接等。。(这只是一个例子)

是否有更好的方法(使用Microsoft SQL Server 2014)?

使用
行数()
秩()

也就是说,相关子查询通常具有稍好的性能:

select t.*
from turnover t
where t.id = (select max(t2.id) from turnover t2 where t2.bankaccnumber = t.bankaccnumber)
特别是对于
营业额(bankaccnumber,id)
索引,您可以使用row\u number()来获取每个组的最后一行。像这样的

with LastRow as
(
   SELECT t1.*, row_number()over (partition by bankaccnumber order by id desc)rn
   FROM turnover t1 
)
select * from LastRow where rn=1
此处
row_number()(按bankaccnumber按id desc进行分区)
将按id的降序为每个bankaccnumber创建一个从1开始的序列号

with LastRow as
(
   SELECT t1.*, row_number()over (partition by bankaccnumber order by id desc)rn
   FROM turnover t1 
)
select * from LastRow where rn=1