0

我有一个看起来像这样的 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 的精确副本。我在这里做错了什么?

4

2 回答 2

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;

但就性能而言,两者应该非常相似。主要区别在于当两行具有相同的最小等级时。第一个版本将返回两行。第二个会任意选择其中一个。

于 2013-07-23T15:24:05.777 回答
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

在这里小提琴:http ://sqlfiddle.com/#!3/14fa5/6

于 2013-07-23T15:36:47.333 回答