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;
我有以下问题
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 中使用 我们可以为此使用 TransactionId。然后我们需要将 DISTINCT 更改为 GROUP BY 以便我们可以对该 TransactionId 的 MAX() 进行排序(因此我们可以获得最近访问的帐户)ROW_NUMBER()
。
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;