楼主: fyp198744
1302 7

[问答] 能不能用sql的子查询一次性标记好? [推广有奖]

  • 0关注
  • 1粉丝

讲师

2%

还不是VIP/贵宾

-

威望
0
论坛币
135 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
5181 点
帖子
257
精华
0
在线时间
258 小时
注册时间
2016-5-23
最后登录
2019-9-30

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
原始数据是这样的a=
iddatedatenumbaseline

1

2016-10-11

visit1

2017-1-1

1

2016-11-11

visit2

2017-1-1

1

2016-12-11

visit3

2017-1-1

1

2016-12-22

visit4

2017-1-1

1

2016-12-25

visit5

2017-1-1

1

2016-12-27

visit6

2017-1-1

2

2016-10-26

visit1

2017-1-1

2

2016-11-26

visit2

2017-1-1

2

2016-12-26

visit3

2017-1-1

2

2017-1-6

visit4

2017-1-1

2

2017-1-9

visit5

2017-1-1

2

2017-1-11

visit6

2017-1-1

3

2016-11-10

visit1

2017-1-1

3

2016-12-11

visit2

2017-1-1

3

2017-1-10

visit3

2017-1-1

3

2017-1-21

visit4

2017-1-1

3

2017-1-24

visit5

2017-1-1

3

2017-1-26

visit6

2017-1-1

4

2016-11-25

visit1

2017-1-1

4

2016-12-26

visit2

2017-1-1

4

2017-1-25

visit3

2017-1-1

4

2017-2-5

visit4

2017-1-1

4

2017-2-8

visit5

2017-1-1

4

2017-2-10

visit6

2017-1-1

5

2016-12-10

visit1

2017-1-1

5

2017-1-10

visit2

2017-1-1

5

2017-2-9

visit3

2017-1-1

5

2017-2-20

visit4

2017-1-1

5

2017-2-23

visit5

2017-1-1

5

2017-2-25

visit6

2017-1-1

我的逻辑规则呢是以“id”变量分组,“date”<“baseline(2017-1-1)”的最后一个日期,标记“Y”;
出来的结果应该是这样的;
iddatedatenumbaselineflag

1

2016-10-11

visit1

2017-1-1

1

2016-11-11

visit2

2017-1-1

1

2016-12-11

visit3

2017-1-1

1

2016-12-22

visit4

2017-1-1

1

2016-12-25

visit5

2017-1-1

1

2016-12-27

visit6

2017-1-1

Y

2

2016-10-26

visit1

2017-1-1

2

2016-11-26

visit2

2017-1-1

2

2016-12-26

visit3

2017-1-1

Y

2

2017-1-6

visit4

2017-1-1

2

2017-1-9

visit5

2017-1-1

2

2017-1-11

visit6

2017-1-1

3

2016-11-10

visit1

2017-1-1

3

2016-12-11

visit2

2017-1-1

Y

3

2017-1-10

visit3

2017-1-1

3

2017-1-21

visit4

2017-1-1

3

2017-1-24

visit5

2017-1-1

3

2017-1-26

visit6

2017-1-1

4

2016-11-25

visit1

2017-1-1

4

2016-12-26

visit2

2017-1-1

Y

4

2017-1-25

visit3

2017-1-1

4

2017-2-5

visit4

2017-1-1

4

2017-2-8

visit5

2017-1-1

4

2017-2-10

visit6

2017-1-1

5

2016-12-10

visit1

2017-1-1

Y

5

2017-1-10

visit2

2017-1-1

5

2017-2-9

visit3

2017-1-1

5

2017-2-20

visit4

2017-1-1

5

2017-2-23

visit5

2017-1-1

5

2017-2-25

visit6

2017-1-1

分步我也能做出来,但是比较复杂,希望能找到一种比较简洁的方法,十分看好sql的子查询!
顺便问一句,sql能实现子查询的嵌套吗?就是在子查询里再套个子查询,实现3层,甚至更多层的子查询!
二维码

扫码加我 拉你入群

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

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

关键词:sql 一次性 不能用 子查询 Baseline

沙发
wwang111 发表于 2016-11-8 10:36:19 |只看作者 |坛友微信交流群
proc sql;
create table wanted as
select a.*, b.flag
from a left join
  (select *, "Y" as flag, baseline-date as dur
   from a
   where date<=baseline
   group by id
   having dur=min(dur)) b
on a.id=b.id and a.date=b.date and a.datenum=b.datenum;
quit;
已有 1 人评分经验 收起 理由
李会超 + 80 精彩帖子

总评分: 经验 + 80   查看全部评分

使用道具

藤椅
wang1839 在职认证  发表于 2016-11-8 11:11:23 |只看作者 |坛友微信交流群
曾经的CRO programmer路过。
proc sql;
create table base as select id,datenum ,"Y" as flag from a where date<=baseline group by id having date=max(date);
quit;
然后MERGE回去
已有 1 人评分经验 收起 理由
李会超 + 80 精彩帖子

总评分: 经验 + 80   查看全部评分

使用道具

板凳
wang1839 在职认证  发表于 2016-11-8 11:15:08 |只看作者 |坛友微信交流群
建议不要写SQL的长句,不方便CHK

使用道具

报纸
fyp198744 发表于 2016-11-8 14:03:03 |只看作者 |坛友微信交流群
wwang111 发表于 2016-11-8 10:36
proc sql;
create table wanted as
select a.*, b.flag
baseline-date是不是应该改成baseline,date

使用道具

地板
wwang111 发表于 2016-11-8 15:29:44 |只看作者 |坛友微信交流群
fyp198744 发表于 2016-11-8 14:03
baseline-date是不是应该改成baseline,date
不是吧,应该是baseline跟date的差啊

使用道具

7
fyp198744 发表于 2016-11-8 15:46:48 |只看作者 |坛友微信交流群
好的!还有,你的sql是怎么学的?貌似很强!有没有专门介绍sas的sql的中文书籍?

使用道具

8
wwang111 发表于 2016-11-8 16:16:47 |只看作者 |坛友微信交流群
fyp198744 发表于 2016-11-8 15:46
好的!还有,你的sql是怎么学的?貌似很强!有没有专门介绍sas的sql的中文书籍?
中文的我没看过,不过建议看一下SAS OnlineTutor 9.1 Advanced Programming这本书

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 19:04