Sql 选择每组的5条最新记录

Sql 选择每组的5条最新记录,sql,sql-server,tsql,common-table-expression,Sql,Sql Server,Tsql,Common Table Expression,下面的语句检索SQL Server中每个组中的前2条记录。它工作正常,但正如您所看到的,它根本不可缩放。我的意思是,如果我想检索前5或前10条记录,而不是仅仅检索2条记录,那么您可以看到这个查询语句将如何快速增长 如何将此查询转换为返回相同记录的内容,但我可以快速将其更改为返回每个组中的前5或前10条记录,而不是仅返回2条记录?i、 e.我只想告诉它返回每个组中的前5名,而不是按照下面的格式要求有5个工会 谢谢 WITH tSub as (SELECT CustomerID,

下面的语句检索SQL Server中每个组中的前2条记录。它工作正常,但正如您所看到的,它根本不可缩放。我的意思是,如果我想检索前5或前10条记录,而不是仅仅检索2条记录,那么您可以看到这个查询语句将如何快速增长

如何将此查询转换为返回相同记录的内容,但我可以快速将其更改为返回每个组中的前5或前10条记录,而不是仅返回2条记录?i、 e.我只想告诉它返回每个组中的前5名,而不是按照下面的格式要求有5个工会

谢谢

WITH tSub 
     as (SELECT CustomerID, 
                TransactionTypeID, 
                Max(EventDate)     as EventDate, 
                Max(TransactionID) as TransactionID 
         FROM   Transactions 
         WHERE  ParentTransactionID is NULL 
         Group  By CustomerID, 
                   TransactionTypeID) 

SELECT * 
from   tSub 
UNION 
SELECT t.CustomerID, 
       t.TransactionTypeID, 
       Max(t.EventDate)     as EventDate, 
       Max(t.TransactionID) as TransactionID 
FROM   Transactions t 
WHERE  t.TransactionID NOT IN (SELECT tSub.TransactionID 
                               FROM   tSub) 
       and ParentTransactionID is NULL 
Group  By CustomerID, 
          TransactionTypeID 

使用分区方式来解决此类型的问题

select values from
(select values ROW_NUMBER() over (PARTITION by <GroupColumn> order by <OrderColumn>) 
as rownum from YourTable) ut where ut.rownum<=5

这将在您想要的列上按事件日期顺序对结果进行分区,然后选择包含rownumYOu应该查看关键字Rankt的条目通过按顺序分区查看窗口函数谢谢!他们确实提供了帮助,加上下面@Learning的答案,我终于完成了。很好,太好了!当MarkMonforti和@Evgeni在我最初的问题中提到Rank和Over作为注释时,我已经实现了它,但不确定如何将Rank作为where子句的一部分。你的回答澄清了这一点。谢谢