【问题标题】:Need to filter 3 columns with row_number()需要使用 row_number() 过滤 3 列
【发布时间】: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会返回三行。

标签: sql database amazon-redshift


【解决方案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 中可以看出,没有任何

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-08
      • 2019-08-19
      • 2015-09-17
      • 1970-01-01
      • 2015-01-17
      • 2014-11-17
      • 1970-01-01
      • 2016-11-04
      相关资源
      最近更新 更多