SQL Server选择带有扭曲的排名数据的第一个实例

时间:2013-07-23 15:13:51

标签: sql sql-server

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

2 个答案:

答案 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

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