sql - SAS左连接获得的记录多于第一个表中的记录
问题描述
table a
x y z
123 london Data engineer
345 United states Software engineer
678 South africa Electrical engineer
Table b
X U
123 David
345 Mike
910 Mark
678 Steve
121 Kyle
Output
X Y Z U
123 London Data engineer David
345 United states Software engineer Mike
678 South Africa Electrical engineer Steve
当我使用 proc SQL left join 时,我得到了超过 3 条记录。请你帮助我好吗
处理 SQL;
create table x as
select
a.*,
b.u
from
table a
left join table b
on a.x = b.x;
quit;
解决方案
如果 aleft join
返回的记录多于原始表中的记录,则您在右侧表或查询中有连接变量的重复值。
解决这个问题的常用方法是:
如果右侧表的每个 ID 1有多个记录,但它们保证对于您从该表返回的变量具有相同的值,则可以
distinct
在子查询中使用以将它们减少为单个记录。select * from a left join (select distinct x,y from b) b on a.x=b.x
如果右侧表在您有多个记录时返回您想要汇总的值(例如,使用
sum
或mean
),请在子查询中执行此操作,并按 ID 变量分组。select * from a left join (select x, sum(y) from b group by x) b on a.x=b.x
否则,您将不得不使用一些逻辑 - 无论是在查询中,还是在您加入之前。这就是在 SAS 数据步骤中执行此操作有时会更好的地方;例如,如果您想要最新的值,在数据步骤中预处理它会更容易一些(SQL 也可以这样做,但它是一个更复杂且通常更慢的查询)。
1我使用术语 ID 来指代您加入表格的任何内容。
推荐阅读
- php - 如何在php中对数组值求和?
- c# - 在循环内使用 LINQ 实体框架表达式中的变量获取最后一个值
- go - 使用 CloudSQL 和 Google App Engine 使用 Gorm 部署 Go 后端时出现服务器错误 500
- c# - 为什么我的 WPF 应用程序加载动画钢冻结?
- python - 从字符串列表中删除键和值
- sql - 使用 t-sql 从一组特定数字中获取 6 个数字的所有组合
- javascript - 双向范围滑块,具有两个方向的颜色
- python - 3D python scipy数据插值的问题-在结果数据上交换轴
- typescript - 未捕获的类型错误:无法读取未定义的属性“振动”
- c - 凯撒密码没有被check50清除,不知道为什么