如何使用CTE从PARTITION BY子句获得最大值

时间:2017-07-13 12:52:48

标签: sql-server sql-server-2008

WITH ABC AS 
    (
        SELECT ACCOUNTID,ROW_NUMBER() OVER (PARTITION BY ACCOUNTID ORDER BY ACCOUNTID) AS NUMBER FROM BankRequest
    )

    SELECT * FROM ABC

当前查询为我提供如下输出

    ACCOUNTID   NUMBER
    897         1
    897         2
    897         3
    1110        1
    1110        2
    1110        3
    1110        4
    1119        1
    1119        2
    1119        3
    1119        4
    1146        1
    1146        2
    1182        1
    1395        1
    1395        2
    1395        3
    1395        4
    1395        5

预期输出将类似于

    ACCOUNTID   NUMBER
    897         3
    1110        4
    1119        4
    1146        2
    1182        1
    1395        5

我正在使用SQL 2016并尝试从BankRequest表获取多条记录。在这个表中,每个accountid有多个记录,如我在上面提到的第一个表。但我只想从BankRequest表中获得每个accountid的最后一个交易ID。

请帮助我解决这个问题或任何更好的替代方式,我可以达到预期的输出。

4 个答案:

答案 0 :(得分:1)

最终选择中的两个快速选项

Select AccountID,Number=max(number) 
 From  ABC 
 Group By AccountID

Select Top 1 with ties *
 From  ABC
 Order By Row_Number() over (Partition By AccountID Order By Number Desc)

或消除CTE

Select AccountId
       Number = count(*)
 From  BankRequest
 Group By AccountId

答案 1 :(得分:1)

或者您可以使用相同的cte并获得Number = 1,如下所示:

;WITH ABC AS 
(
    SELECT ACCOUNTID,NUMBER, ROW_NUMBER() OVER (PARTITION BY ACCOUNTID ORDER BY Number DESC) AS RowN FROM BankRequest
)
SELECT ACCOUNTID, NUMBER FROM ABC
where RowN = 1

这类似于John提到的关系中的前1名

答案 2 :(得分:0)

使用ORDER BY AccountID DESC,然后选择行号为1的位置。

但是,我认为你给了我们一个不完整的数据集。

“我只希望每个accountid的最后一个交易ID”意味着你应该真的ORDER BY transactionId DESC

答案 3 :(得分:0)

您可以使用下面的CTE + Row_Number() + Max()

;WITH BankRequest_Row_Number_By_ACCOUNTID
AS
(
    SELECT  ACCOUNTID, 
            Row_NUmber() over (Partition by ACCOUNTID order by ACCOUNTID) AS rowNumber_ACCOUNTID
    FROM    BankRequest

)
SELECT  ACCOUNTID,
        MAX(rowNumber_ACCOUNTID) AS NUMBER
FROM    BankRequest_Row_Number_By_ACCOUNTID
GROUP BY ACCOUNTID