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

w1e3prcc  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(582)

因此,我应该创建一个基于巨大数据集中每个组的最后一行(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;

性能不是很好,我后来不得不添加与客户等相关的附加连接这只是一个例子)
有没有更好的方法(使用microsoft sql server 2014)?

kqqjbcuj

kqqjbcuj1#

使用 row_number() 或者 rank() :

select t.*
from (select t.*,
             row_number() over (partition by bankaccnumber order by id desc) as seqnum
      from turnover t
     ) t
where seqnum = 1;

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

select t.*
from turnover t
where t.id = (select max(t2.id) from turnover t2 where t2.bankaccnumber = t.bankaccnumber)

尤其是在有索引的情况下 turnover(bankaccnumber, id) .

ws51t4hk

ws51t4hk2#

您可以使用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()over (partition by bankaccnumber order by id desc) 将为每个bankaccumber按id的降序创建一个从1开始的序列号。

相关问题