需要使用 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 列的主要内容,如果未能解决你的问题,请参考以下文章