基于未排序的列过滤排名

Posted

技术标签:

【中文标题】基于未排序的列过滤排名【英文标题】:Filter Rank Based On Column Not being Ordered By 【发布时间】:2021-06-03 20:04:12 【问题描述】:

这是一些假数据/样本数据:

DECLARE @tbl1 TABLE (PersonID VARCHAR(255), FirstNM VARCHAR(100), FileNBR VARCHAR(255));
INSERT INTO @tbl1 (PersonID, FirstNM, FileNBR) VALUES
('456789', 'NONAME', 'FileNBR780'),
('456789', 'John', 'FileNBR781'),
('456789', 'NONAME', 'FileNBR783'),
('476362', 'NONAME', 'FileNBR780'),
('476362', 'Mary', 'FileNBR781'),
('476362', 'Mary', 'FileNBR783')
PersonID  FirstNM   FileNBR
456789    NONAME    FileNBR780
456789    John      FileNBR781
456789    NONAME    FileNBR783
476362    NONAME    FileNBR780
476362    Mary      FileNBR781
476362    Mary      FileNBR783

我正在尝试对 FileNBR 和 PersonID 进行排名。我想让任何 FirstNM 为“NONAME”的 PersonID 排在最后,尽管在 FileNM 中排名。

这是我目前所拥有的。 NONAME 不排第一怎么办?

SELECT
 PersonID
 ,FirstNM  
 ,ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY FileNBR ASC) AS RankNBR
FROM @tbl1

产生这些结果:

PersonID    FirstNM  RankNBR
456789      NONAME   1
456789      John     2
456789      NONAME   3
476362      NONAME   1
476362      Mary     2
476362      Mary     3 

但是,这些是想要的结果:

PersonID    FirstNM  RankNBR
456789      John     1
456789      NONAME   2
456789      NONAME   3
476362      Mary     1
476362      Mary     2
476362      NONAME   3

【问题讨论】:

这是 mysql SSMS。你用的是哪一个? @jarlh,它在 SSMS 中 【参考方案1】:

你快到了,你只需要另一个排序条件来在RankNBR之前排列你的无名氏

SELECT
 PersonID
 ,FirstNM  
 ,ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY case when firstNM='NONAME' then 1 else 0 end,FileNBR ASC) AS RankNBR
FROM @tbl1

【讨论】:

【参考方案2】:

尝试:

select
  PersonID,
  FirstNM,
  row_number() over(
    partition by PersonId 
    order by
      case when FirstNm = 'NONAME' then 'ZZZZ' else FirstNM end
  ) as RankNBR
from @tbl1  

您的定义中并不清楚您是按FirstNM 还是FileNBR 订购,但要获得所需的输出,您必须这样做。

【讨论】:

以上是关于基于未排序的列过滤排名的主要内容,如果未能解决你的问题,请参考以下文章

WPF Datagrid 中的排序和过滤选项?

尝试过滤数据框时“未选择未定义的列”

基于过滤器的列计算?

根据白名单表过滤未过滤的表

在 primefaces 数据表中,轮询未保留排序和过滤

Appengine 过滤器不等式和排序失败