繁体   English   中英

仅在第一次匹配时加入记录

[英]Join records only on first match

我试图加入两个表。 我只希望第一个匹配行加入其他必须是 null。

其中一个表包含每个User的每日记录,第二个表包含每个用户和每天的目标。

连接的结果表应该只连接第一次出现的UserDay并将其他设置为null 连接表中的 Goal 可以解释为DailyGoal

例子:

Table1                                 Table2
Id   Day          User    Value        Id  Day          User   Goal
================================       ============================
01   01/01/2020   Bob     100          01  01/01/2020   Bob    300
02   01/01/2020   Bob     150          02  02/01/2020   Carl   170
03   01/01/2020   Bob     50           
04   02/01/2020   Carl    200          
05   02/01/2020   Carl    30    

ResultTable
Day          User   Value   Goal 
============================================
01/01/2020   Bob    100     300
01/01/2020   Bob    150     (null)
01/01/2020   Bob    50      (null)
02/01/2020   Carl   200     170
02/01/2020   Carl   30      (null)

我尝试做 top1,distinct,子查询,但我找不到办法。 这可能吗?

一种选择使用 window 功能:

select t1.*, t2.goal
from (
    select t1.*,
        row_number() over(partition  by day, user order by id) as rn
    from table1 t1 
) t1
left join table2 t2 on t2.day = t1.day and t2.user = t1.user and t1.rn = 1

case表达式更简单:

select t1.*,
    case when row_number() over(partition  by day, user order by id) = 1
        then t2.goal
    end as goal
from table1 t1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM