数据库两表对比:获取重复匹配结果中的最新值
解决重复匹配取最新值的关联查询方案
我来帮你搞定这个需求——你需要关联click_log和筛选后的km_articles记录,匹配link_clicked和km_article_no,还要从重复的匹配结果里提取最新的那条记录对吧?下面给你具体的实现思路和SQL代码:
核心思路
- 先从
km_articles里筛选出符合条件的文章编号(日期≤2017-10-31、状态为Published、浏览量≤5); - 将这些文章编号和
click_log的link_clicked做关联; - 对每个匹配的文章编号分组,用排序函数标记出每组里的最新记录,最后只保留最新的那条。
具体SQL实现
假设click_log表中有一个用于判断“最新”的字段——比如记录点击时间的click_timestamp(如果你的表用的是自增ID比如click_id,替换成对应的字段即可),代码如下:
-- 第一步:筛选符合条件的文章编号 WITH filtered_articles AS ( SELECT km_article_no FROM km_articles WHERE km_article_date <= '2017-10-31' AND km_article_status = 'Published' AND km_article_view_count <= 5 ), -- 第二步:关联日志并给每组记录排名(最新的排第1) ranked_clicks AS ( SELECT cl.*, ROW_NUMBER() OVER ( PARTITION BY cl.link_clicked -- 按匹配的文章号分组 ORDER BY cl.click_timestamp DESC -- 按点击时间倒序,最新的在前 ) AS record_rank FROM click_log cl JOIN filtered_articles fa ON cl.link_clicked = fa.km_article_no ) -- 第三步:只保留每组排名第1的最新记录 SELECT * FROM ranked_clicks WHERE record_rank = 1;
关键细节说明
- 关于“最新值”的判断:如果你的
click_log没有时间戳字段,而是用自增ID来标识记录的先后顺序,只需要把ORDER BY cl.click_timestamp DESC改成ORDER BY cl.click_id DESC即可; - 自定义返回字段:如果不需要返回
click_log的所有字段,把cl.*替换成你需要的具体字段(比如cl.link_clicked, cl.click_user, cl.click_timestamp); - 处理匹配范围:JOIN默认是INNER JOIN,会自动排除
click_log中未匹配到目标文章编号的记录;如果需要保留这些未匹配记录,可以改成LEFT JOIN,但根据你的需求用INNER JOIN就足够了。
内容的提问来源于stack exchange,提问作者Sergio Florez
相关产品推荐
相关产品推荐

