SQL 服务器:从另一个 CTE 查询中获取 DISTINCT TOP 列表

SQL Server : getting DISTINCT TOP list from a another CTE query

我有以下问题

WITH Recent_BankAccountNumber_CTE (BankAccountNumber, TransactionId) AS 
(
    SELECT TOP 25 BankAccountNumber, TransactionId
    FROM [Transaction]
    WHERE CustomerId = 1234
    ORDER BY TransactionId DESC
)
SELECT 
    BankAccountNumber, TransactionId 
FROM 
    Recent_BankAccountNumber_CTE 
ORDER BY 
    OutboundTransactionId DESC

我得到这个输出:

BankAccountNumber   OutboundTransactionId
------------------------------------------
8002950781          32078
8002950781          32077
8002950781          32076
016200270000486     32075
121054658698        32074
035200146349621     32073
200300019256        32072
200300019256        32071
200300019256        32070
200300019256        31088
018021030517        31087
102957612131        31086
100336018793        31085
100336018793        31084
042033430297001     31083
042033430297001     31082
100336018793        31081
8004062604          31080
102957612131        31079
042033430297001     31078
121054658698        31077
111353490614        31076
121054658698        31075
82455039            31074
110854031395        31073

我追求的是

只要我这样做(而不是上面)

SELECT DISTINCT TOP 10 (BankAccountNumber) 
FROM Recent_BankAccountNumber_CTE

我在下面,这是不正确的

BankAccountNumber
-----------------
016200270000486
018021030517
035200146349621
042033430297001
100336018793
102957612131
110854031395
111353490614
121054658698
200300019256

有人可以告诉我 DISTINCT TOP 10 有什么问题吗?

'top 10' 组件通常需要排序。在您的情况下,它没有它们,因此(显然)正在按字母顺序排序(因此首先是 0,然后是 1,然后是 2)。

因此,您需要一个值来根据您的 CTE 进行排序。 一种方法是在 CTE 中使用 ROW_NUMBER() 我们可以为此使用 TransactionId。然后我们需要将 DISTINCT 更改为 GROUP BY 以便我们可以对该 TransactionId 的 MAX() 进行排序(因此我们可以获得最近访问的帐户)

WITH Recent_BankAccountNumber_CTE (BankAccountNumber, TransactionId) AS (
                 SELECT TOP 25 BankAccountNumber, TransactionId
                 FROM  [Transaction]
                 WHERE CustomerId = 1234
                 ORDER BY TransactionId desc)
SELECT   TOP 10 BankAccountNumber
FROM     Recent_BankAccountNumber_CTE 
GROUP BY BankAccountNumber
ORDER BY MAX(TransactionId) DESC;

这是更新后的 db<>fiddle 原始答案和这个答案 - 请注意,我必须进行一些调整才能将数据用作 CTE。

tl;dr 版本:您需要对其进行排序以获取最新交易 - 在本例中为 MAX(TransactionID) DESC。但是,您需要将 DISTINCT 方法更改为 GROUP BY,因为 MAX() 部分不适用于 DISTINCT。


更新:没有 CTE 的版本

请注意,可以将上述内容简化为不需要 CTE。但是,我假设 CTE 可能比这个问题中的最小版本更广泛,并且 CTE 使发生的事情相对清楚,只要您在 transaction.CustomerId 上有索引,性能可能会很好(事实上,性能可能比下面的版本更好。

但是,如果需要,您应该可以使用

SELECT   TOP 10 BankAccountNumber
FROM     [Transaction]
WHERE    CustomerId = 1234
GROUP BY BankAccountNumber
ORDER BY MAX(TransactionId) DESC;