需要使用 row_number() 过滤 3 列

Posted

技术标签:

【中文标题】需要使用 row_number() 过滤 3 列【英文标题】:Need to filter 3 columns with row_number() 【发布时间】:2020-06-09 10:36:42 【问题描述】:

我的数据库中有这样的数据

---------------------------------------------------------------
shopid | shopname | keyword | date     | filename
---------------------------------------------------------------
1      | shop1    | A_key       |2020-04-24| A     
---------------------------------------------------------------
1      | shop1    | A_key       |2020-04-24| B
---------------------------------------------------------------
1      | shop1    | B_key       |2020-04-25| B     
---------------------------------------------------------------
1      | shop1    | B_key       |2020-04-25| C     
---------------------------------------------------------------
2      | shop2    | C_key       |2020-04-24| A     
---------------------------------------------------------------
2      | shop2    | C_key       |2020-04-24| B
---------------------------------------------------------------
3      | shop3    | D_key       |2020-04-24| A    
---------------------------------------------------------------
3      | shop3    | D_key       |2020-04-24| B    
---------------------------------------------------------------
3      | shop3    | E_key       |2020-04-24| A 
---------------------------------------------------------------
3      | shop3    | E_key       |2020-04-25| B
---------------------------------------------------------------

我想要的结果是来自最新文件名的最新数据

---------------------------------------------------------------
shopid | shopname | keyword | date     | filename
---------------------------------------------------------------
1      | shop1    | A_key       |2020-04-24| B
---------------------------------------------------------------
1      | shop1    | B_key       |2020-04-25| C     
---------------------------------------------------------------
2      | shop2    | C_key       |2020-04-24| B
---------------------------------------------------------------
3      | shop3    | D_key       |2020-04-24| B    
---------------------------------------------------------------
3      | shop3    | E_key       |2020-04-24| A 
---------------------------------------------------------------
3      | shop3    | E_key       |2020-04-25| B
---------------------------------------------------------------

我想知道如何用 sql 做到这一点 我的 sql 是

select *,rank() over (partition by date,keyword order by filename desc) rank
from table
 order by date asc;

【问题讨论】:

我不明白为什么shopid = 3会返回三行。 【参考方案1】:

我想要的结果是来自最新文件名的最新数据

我不完全理解这一点。以下返回每个商店的最新日期行:

select t.*
from (select t.*,
             rank() over (partition by shopid order by date desc) as seqnum
      from table t
     ) t
where seqnum = 1;

【讨论】:

【参考方案2】:

看起来您希望每个商店/关键字/日期有一行,如果有不止一行符合此条件,请使用文件名来确定哪个是最新的(C 晚于 B 等)

您可以为此使用分析:

SELECT 
  x.*
FROM 
  (
    SELECT
      *,
      row_number() over (partition by shopid,keyword,date order by filename desc) as rn
    FROM 
      table 
  ) x
WHERE 
  x.rn = 1

但我敢说你也可以使用标准分组来做到这一点:

SELECT
  shopid, shopname, keyword, date, MAX(filename) as filename
FROM 
  table 
GROUP BY 
  shopid, shopname, keyword, date

如果您想开始添加其他详细列,此方法将失败,但据我从您的 Q 中可以看出,没有任何

【讨论】:

以上是关于需要使用 row_number() 过滤 3 列的主要内容,如果未能解决你的问题,请参考以下文章

具有多个订单列的 dplyr row_number

R:过滤列并使用结果创建一个新表[关闭]

根据列R / dplyr中的“复杂”字符串过滤行

ROW_NUMBER 列结果

列 dplyr 的 row_number 等价物

更新 R Shiny 中的 DT 列过滤器选择