楼主: 马甲1号
2009 6

请教sql问题 [推广有奖]

  • 3关注
  • 3粉丝

已卖:21份资源

副教授

21%

还不是VIP/贵宾

-

威望
0
论坛币
1948 个
通用积分
8.7693
学术水平
159 点
热心指数
165 点
信用等级
144 点
经验
6203 点
帖子
754
精华
0
在线时间
666 小时
注册时间
2010-10-24
最后登录
2024-7-17

楼主
马甲1号 发表于 2011-4-18 18:01:18 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我现在有两个表,

a表:(时间)
date
19990101
19990102
...
20000101
b表:(评级变更记录)
startdate
enddatecredit
1998090119990201
aaa
19990201 19990302 aa
... ... ...
19990903 nullbaa
现在想写段sql语句生成c表,规则是利用b表的信用评级变更记录对a表每条记录进行评级,即生成一个表格,包含A的所有数据,并且对每个date数据,如果它位于b表某个(statdate, enddate)左闭右开区间,则给该条记录添加相应的credit字段。如果enddate为null,表示至今评级未改变。

我很菜,只会先把两者cross join,然后算出一个flag变量来判断date是否在区间中。请问有什么更有效的办法?

我的方法:

select * from
(
   select a.data, b.credit,
   case
      when a.date > =b.startdate and ( a.date <=b.enddate or b.enddate is null) then '1'
      else '0'
   end as flag
   from a cross join b
) c
where c.flag='1'
二维码

扫码加我 拉你入群

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

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

关键词:sql Credit Select Elect Start 新手 sql

回帖推荐

sas_user 发表于5楼  查看完整内容

proc format cntlin=standard; run;   data data; input dates : yymmdd8.; datalines; 19990101 19990102 20000101 ; run; proc print data=data; format dates std.; run;

本帖被以下文库推荐

归欤!归欤!吾党之小子狂简,斐然成章,不知所以裁之。

沙发
myc_sas 发表于 2011-4-18 18:23:27
一定要用sql做么?
感觉上,可以把b表弄成一个format
已有 1 人评分学术水平 热心指数 收起 理由
马甲1号 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

藤椅
soporaeternus 发表于 2011-4-18 20:55:18
感觉直接将null换成一个很大的日期,比如2999-12-31直接就用join就可以了

format更好,效率貌似更高......
已有 1 人评分学术水平 热心指数 收起 理由
马甲1号 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

Let them be hard, but never unjust

板凳
sas_user 发表于 2011-4-20 00:03:35
data format;
input (Start End) (: yymmdd8.) Credit $;
format start end date9.;
datalines;
19980901 19990201 aaa
19990201 19990302 aa
19990903 null baa
run;


data standard;
keep start end label fmtname;
retain fmtname 'std';
set format (rename=(Credit = Label));
if end=. then end=%sysfunc(date());
run;
 

报纸
sas_user 发表于 2011-4-20 00:04:20
proc format cntlin=standard;
run;
 
data data;
input dates : yymmdd8.;
datalines;
19990101
19990102
20000101
;
run;
proc print data=data;
format dates std.;
run;
已有 1 人评分学术水平 热心指数 收起 理由
马甲1号 + 1 + 1 好的意见建议

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

地板
zhaoping603 发表于 2011-4-20 10:51:42
4# sas_user
半夜还在给别人解决问题,赞一个。本人新手,经常来学习高手的解答。

7
sas_user 发表于 2011-4-20 11:15:01
6# zhaoping603
不客气。每个人都有需要帮忙的时候。帮别人就是帮自己。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 00:57