选择每组的5个最新记录

时间:2013-12-27 19:26:01

标签: sql sql-server tsql common-table-expression

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

如何将此查询转换为返回相同记录的内容,但我可以快速更改它以返回每组中的前5或10条记录,而不仅仅是2? (即我想告诉它返回每组中的前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 

1 个答案:

答案 0 :(得分:2)

使用分区依据来解决此类问题

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

这将按 EventDate列对您想要订购的列进行分区,然后选择具有rownum<=5的条目。现在,您可以更改此值5以获取每个组的最新n条目。