繁体   English   中英

SQL Server选择排序数据的第一个实例

[英]SQL Server select first instance of ranked data with a twist

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

您正在寻找完整的行,而不仅仅是最小值。 为此,窗口功能非常方便。

因为您的逻辑使用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;

但是两者在性能方面应该非常相似。 主要区别在于两行具有相同的最低等级。 第一个版本将返回两行。 第二个将任意选择其中之一。

您可以尝试以下方法:

;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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM