2017-07-13 125 views
0
得到PARTITION最大BY子句
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表中獲取多條記錄。在這張表中,每個人都有多個記錄,正如我在上面第一張表中提到的那樣。但我只想從BankRequest表中獲取每個帳戶的最後一個交易ID。如何使用CTE

請幫我解決這個問題或任何更好的替代方法,我可以實現預期的輸出。

回答

0

使用ORDER BY AccountID DESC,並選擇行號爲1

不過,我想,你給了我們一個不完整的數據集。

「我想每個ACCOUNTID只有最後一個事務ID」 意思是你應該大概真的ORDER BY transactionId DESC

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

或者你可以使用你的相同的CTE,並得到數= 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 

這類似於頂部1與約翰提到

+0

解決了這個問題 –

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