最近在工作过程中碰到了大表间的笛卡尔积,这个就比较恶心了,开始完全跑不出来,后来一步步优化,最终起码勉强能有结果,虽然有很多数据特殊性且思路简单,但是也还是记录下。
案例
假设有如下用户登录表 user_login_detail:
user代表用户,
city代表用户登录过得城市,
country代表用户国籍,
other代码其他数据;
user | city | country | other |
---|---|---|---|
A | 上海 | 中国 | … |
A | 杭州 | 中国 | … |
B | 杭州 | 中国 | … |
C | 北京 | 美国 | … |
A | 杭州 | 中国 | … |
登录信息非常多,现在要得到同国籍用户下,同城用户(登录过相同城市的用户)的对应信息,如A的同城用户中,年纪最大的 ;
此时我的第一反应就是,其实逻辑很简单,自己 join 自己然后用个开窗,比如年龄字段是age,大概如下:
select
r1.user,
max(r2.age) over(partition by country) as result_age
from user_login_detail r1