我有一个看起来像这样的Table1:
Wallet No Status Rank
01774076563 Scanned 1
01765653275 Registered 3
01774076563 Accepted 2
01768836816 Rejected 4
01967866981 Accepted 2
01967866981 Rejected 4
我希望它看起来像这样(表2):
Wallet No Status Rank
01774076563 Scanned 1
01765653275 Registered 3
01768836816 Rejected 4
01967866981 Accepted 2
我使用了以下代码,但它显示的是Table1而不是Table2:
SELECT MIN([Rank]) AS [Rank], STATUS_, walletno into table2
FROM table1
GROUP BY STATUS_, walletno
我想要的只是排名最高的钱包没有和状态,没有别的。但Table2给出了Table1的精确副本。我在这里做错了什么?
答案 0 :(得分:1)
您正在寻找完整的行,而不仅仅是最小值。为此,窗口函数很方便。
因为你的逻辑使用min()
,所以这是一个使用该函数的方法:
SELECT [Rank], STATUS_, walletno into table2
FROM (select t.*,
MIN([rank]) over (partition by walletno) as minrank
from table1 t
) t
where [rank] = minrank;
子查询计算每个钱包的最低排名。外部过滤器只保留该行。
我通常会将row_number()
写为:
SELECT [Rank], STATUS_, walletno into table2
FROM (select t.*,
row_number() over (partition by walletno order by [rank]) as seqnum
from table1 t
) t
where seqnum = 1;
但两者在性能方面应该非常相似。主要区别在于两行具有相同的最小等级。第一个版本将返回两行。第二个会随意选择其中一个。
答案 1 :(得分:0)
你可以试试这个:
;WITH CTE as
(
SELECT
WalletNo,
Status,
ROW_NUMBER() OVER(PARTITION BY Status ORDER BY Rank) AS Row,
Rank
FROM
Item
)
SELECT WalletNo, Status, Row, Rank From CTE Where Row = 1