楼主: daazx
2620 6

[问答] SQL 自关联如何去重复? [推广有奖]

  • 0关注
  • 53粉丝

VIP

已卖:2份资源

教授

2%

还不是VIP/贵宾

-

TA的文库  其他...

Hadoop与大数据

威望
0
论坛币
50036 个
通用积分
7.1383
学术水平
176 点
热心指数
197 点
信用等级
114 点
经验
11000 点
帖子
445
精华
3
在线时间
1069 小时
注册时间
2007-10-19
最后登录
2021-6-1
毕业学校
深圳大学

楼主
daazx 在职认证  发表于 2017-8-15 14:46:41 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有下图左边这个 t1 表,想生成右边 t2 表。只能写 SQL 的话,应该如何写?

自关联的话,会出现:a-b-1-7 和 b-a-7-1 这两条记录。而同一对只想出现一次,请问该如何写?

333.png

多谢大神~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sql 如何写

沙发
deem 学生认证  发表于 2017-8-15 15:13:15
  1. data t1;
  2.    input v $ value;
  3.    datalines;
  4. a 1
  5. b 2
  6. c 3
  7. d 4
  8. ;

  9. proc sql;
  10.         create table t2 as
  11.         select a.v as v1, b.v as v2, a.value as value1, b.value as value2
  12.                 from t1 as a, t1 as b
  13.         where a.v < b.v;
  14.         quit;
复制代码

藤椅
daazx 在职认证  发表于 2017-8-16 10:17:42
deem 发表于 2017-8-15 15:13
是可以的,多谢多谢~

实际上我的表中可能有几十万条数据,这样自关联,会不会耗时太久,有些优化的余地么?

板凳
deem 学生认证  发表于 2017-8-16 11:03:06
daazx 发表于 2017-8-16 10:17
是可以的,多谢多谢~

实际上我的表中可能有几十万条数据,这样自关联,会不会耗时太久,有些优化的余地 ...
会很影响的,你需要先建立一个辅助数据集,生成t2的前两列,接下来就是1:1匹配,不然的话SQL太慢了。
  1. data t1;
  2.    input v $ value;
  3.    datalines;
  4. a 1
  5. b 2
  6. c 3
  7. d 4
  8. ;

  9. * 添加一个辅助列作为组的ID ;
  10. data t1;
  11.     set t1;
  12.     id_group = _n_;
  13.     run;
  14.    
  15. proc print data=t1; run;

  16. * 构造一个中间数据集用来1:1匹配 ;
  17. data t2;
  18.     do i_group = 1 to 4;
  19.         do j_group = (i_group+1) to 4;
  20.         output;
  21.         end;
  22.     end;
  23.     run;
  24. proc print data=t2; run;

  25. * 依靠中间数据集完成匹配 ;
  26. proc sql;
  27.     create table t3 as
  28.     select a.v as v1, b.v as v2, a.value as value1, b.value as value2
  29.         from t2 as c
  30.         inner join t1 as a
  31.             on c.i_group = a.id_group
  32.         inner join t1 as b
  33.             on c.j_group = b.id_group
  34.         order by v1, v2;
  35.     quit;
  36.    
  37. proc print data=t3; run;
复制代码

报纸
deem 学生认证  发表于 2017-8-16 11:03:08
daazx 发表于 2017-8-16 10:17
是可以的,多谢多谢~

实际上我的表中可能有几十万条数据,这样自关联,会不会耗时太久,有些优化的余地 ...
会很影响的,你需要先建立一个辅助数据集,生成t2的前两列,接下来就是1:1匹配,不然的话SQL太慢了。
  1. data t1;
  2.    input v $ value;
  3.    datalines;
  4. a 1
  5. b 2
  6. c 3
  7. d 4
  8. ;

  9. * 添加一个辅助列作为组的ID ;
  10. data t1;
  11.     set t1;
  12.     id_group = _n_;
  13.     run;
  14.    
  15. proc print data=t1; run;

  16. * 构造一个中间数据集用来1:1匹配 ;
  17. data t2;
  18.     do i_group = 1 to 4;
  19.         do j_group = (i_group+1) to 4;
  20.         output;
  21.         end;
  22.     end;
  23.     run;
  24. proc print data=t2; run;

  25. * 依靠中间数据集完成匹配 ;
  26. proc sql;
  27.     create table t3 as
  28.     select a.v as v1, b.v as v2, a.value as value1, b.value as value2
  29.         from t2 as c
  30.         inner join t1 as a
  31.             on c.i_group = a.id_group
  32.         inner join t1 as b
  33.             on c.j_group = b.id_group
  34.         order by v1, v2;
  35.     quit;
  36.    
  37. proc print data=t3; run;
复制代码

地板
deem 学生认证  发表于 2017-8-16 11:03:11
daazx 发表于 2017-8-16 10:17
是可以的,多谢多谢~

实际上我的表中可能有几十万条数据,这样自关联,会不会耗时太久,有些优化的余地 ...
会很影响的,你需要先建立一个辅助数据集,生成t2的前两列,接下来就是1:1匹配,不然的话SQL太慢了。
  1. data t1;
  2.    input v $ value;
  3.    datalines;
  4. a 1
  5. b 2
  6. c 3
  7. d 4
  8. ;

  9. * 添加一个辅助列作为组的ID ;
  10. data t1;
  11.     set t1;
  12.     id_group = _n_;
  13.     run;
  14.    
  15. proc print data=t1; run;

  16. * 构造一个中间数据集用来1:1匹配 ;
  17. data t2;
  18.     do i_group = 1 to 4;
  19.         do j_group = (i_group+1) to 4;
  20.         output;
  21.         end;
  22.     end;
  23.     run;
  24. proc print data=t2; run;

  25. * 依靠中间数据集完成匹配 ;
  26. proc sql;
  27.     create table t3 as
  28.     select a.v as v1, b.v as v2, a.value as value1, b.value as value2
  29.         from t2 as c
  30.         inner join t1 as a
  31.             on c.i_group = a.id_group
  32.         inner join t1 as b
  33.             on c.j_group = b.id_group
  34.         order by v1, v2;
  35.     quit;
  36.    
  37. proc print data=t3; run;
复制代码

7
superguy333 发表于 2017-8-17 00:08:01
这是个好问题,先留下足迹,解决后再回帖

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 18:39