从组中选择前5名

时间:2018-02-20 17:17:31

标签: sql sql-server tsql

我有这个由客户订购的交易清单#然后是交易日期。我想要的是有一个这样的列表,除了只选择每个客户#的前5个事务#。如果有人能告诉我该怎么做,我真的很感激!

Transaction list example

我正在使用sql server 2012

3 个答案:

答案 0 :(得分:1)

您可以使用Window Function Dense_RANK()

SELECT
 dt.client_no, dt.Last_Mdt, dt.price, dt.Tax_1, dt.Cashier
FROM(
SELECT client_no, Last_Mdt, price, Tax_1, Cashier,
      DENSE_RANK () OVER       (PARTITION BY client_no ORDER BY Last_Mdt ASC) AS Rank  
 FROM  Table
)dt 
WHERE dt.Rank <=5

答案 1 :(得分:0)

我们也可以使用cross / outer apply运算符来处理这类东西。您可以选择交叉/外部申请,并可以根据您的要求进行订购。

SELECT k.* 
FROM Table a
OUTER APPLY
(
    SELECT TOP 5 *
    FROM Table b
    WHERE a.client_no = b.client_no
    ORDER BY b.Last_Mdt ASC 
)k

答案 2 :(得分:0)

使用CROSS APPLY的替代选项。

SELECT DISTINCT yt.client_no, ca.Last_Mdt, ca.price, ca.Tax_1, ca.Cashier
FROM YourTable yt
CROSS APPLY (SELECT TOP 5 *
             FROM YourTable
             WHERE client_no = yt.client_no
             ORDER BY Last_Mdt ASC) ca

或者,如果您也有客户表。大概client_no已经是唯一的。

SELECT yct.client_no, ca.Last_Mdt, ca.price, ca.Tax_1, ca.Cashier
FROM YourClientTable yct
CROSS APPLY (SELECT TOP 5 *
             FROM YourTable
             WHERE client_no = yt.client_no
             ORDER BY Last_Mdt ASC) ca