楼主: fenghuang828
1950 6

[问答] 如何用SAS 解决这一难题 频道节目单与收看 多对多的关系 [推广有奖]

  • 0关注
  • 0粉丝

本科生

33%

还不是VIP/贵宾

-

威望
0
论坛币
46 个
通用积分
1.8500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2813 点
帖子
30
精华
0
在线时间
136 小时
注册时间
2009-6-4
最后登录
2025-10-15

楼主
fenghuang828 发表于 2014-5-22 16:43:19 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
现有两个表,一个表是节目单简称A表,变量是频道ID、频道名称、节目名称,节目播出日期,节目播出开始时间,节目播出结束时间。A表一个月的节目单有近10万条数据,如频道ID   频道名称    节目名称                                             节目播出日期 节目播出开始时间         节目播出结束时间

22201011重庆卫视车世界2014-03-0101MAR2014:11:40:0401MAR2014:12:00:02
22201011重庆卫视TICO欢乐假日:阿U乐园:U爸的午餐2014-03-0101MAR2014:13:58:3101MAR2014:14:02:59
22201011重庆卫视TICO欢乐假日:猪猪侠变身小英雄(48)2014-03-0101MAR2014:16:18:0701MAR2014:16:36:30
21101011浙江卫视大丈夫(2)2014-03-0101MAR2014:13:22:2601MAR2014:14:17:07
21101011浙江卫视浙江新闻联播2014-03-0101MAR2014:18:30:0301MAR2014:18:52:58
21101011浙江卫视大丈夫(36)2014-03-0101MAR2014:20:23:1001MAR2014:21:13:14
22501011云南卫视云南新闻联播2014-03-0101MAR2014:18:30:0301MAR2014:18:55:03
22702041西安文化影视武林外传(68)2014-03-0101MAR2014:07:51:4801MAR2014:08:52:17
B表(1个月30天数据有1亿4千万条)是收看直播的表 变量为 频道ID  频道名称 收看日期  收看频道开始时间 收看频道结束时间 如下

频道ID         频道名称     收看日期       收看频道开始时间        收看频道结束时间
40901221东方购物2014-03-0101MAR2014:09:29:2101MAR2014:09:29:45
22101011旅游卫视2014-03-0101MAR2014:17:05:2401MAR2014:17:05:33
22201011重庆卫视2014-03-0101MAR2014:21:06:5601MAR2014:21:07:03
20001071CCTV-72014-03-0101MAR2014:23:49:5101MAR2014:23:50:13
20001141CCTV-少儿2014-03-0101MAR2014:19:28:1901MAR2014:19:28:35
20001141CCTV-少儿2014-03-0101MAR2014:15:32:0301MAR2014:17:56:58
20001081CCTV-82014-03-0101MAR2014:20:47:3301MAR2014:20:47:44
20001041CCTV-42014-03-0101MAR2014:07:26:2101MAR2014:07:51:26
现 想计算各节目的 收视时长,如节目单A表是3月1号播出的节目 在B表3月1号的 收视时长 如一个节目是否被收看有四种可能,单个节目可以算出来,但是如何批量计算,两个表的连接是多对多,HASH? 请各大侠,大牛指教,小弟膜拜

二维码

扫码加我 拉你入群

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

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

关键词:节目单 如何用 cctv 重庆卫视 浙江卫视 重庆卫视 节目单 猪猪侠 英雄 频道

沙发
fenghuang828 发表于 2014-5-22 17:14:59
补充,A表节目单下有好多个频道,每个频道下面有好多节目,B表只有频道没有节目

藤椅
mingfeng07 学生认证  发表于 2014-5-22 23:48:21
  1. /*令A表中变量分别命名为channel_id,channel_name,act_name,date_play,time_play,time_end*/
  2. /*令B表中变量分别命名为channel_id,channel_name,date_look,time_look,channel_end*/
  3. proc sql;
  4. create table c as select date_play,act_name,max(sum(-max(time_play,time_look),min(time_end,channel_end)),0) as time_total from a,b
  5.                                                                    where a.channel_name=b.channel_name and a.date_play=b.date_look;
  6. quit;
  7. /*最后得到的结果是按秒计算的,如果要得到小时的话,可以自行进行转换*/
复制代码
欢迎扫一扫我头像关注, 不定期分享SAS技术知识。

板凳
fenghuang828 发表于 2014-5-23 13:38:08
proc sql 因为数据量比较大,运行速度非常缓慢,有没有SAS 语言的解决方案

报纸
mingfeng07 学生认证  发表于 2014-5-23 21:31:36
  1. /*令A表中变量分别命名为channel_id,channel_name,act_name,date_play,time_play,time_end*/
  2. /*令B表中变量分别命名为channel_id,channel_name,date_look,time_look,channel_end*/
  3. proc sort data=a;by channel_name date_play;run;
  4. proc sort data=b;by channel_name date_look;run;
  5. data c;
  6. merge a(in=a)  b(rename=(date_look=date_play)in=b);
  7. by channel_name date_play;
  8. if a and b;
  9. time_total=max(sum(-max(time_play,time_look),min(time_end,channel_end)),0);
  10. run;
复制代码
欢迎扫一扫我头像关注, 不定期分享SAS技术知识。

地板
wklkw 在职认证  发表于 2014-5-26 11:08:03
要确认几个信息:

1.B表应为流水表,需求的目的是将A表信息匹配到B表,匹配前后B表记录数应该不变。
2.A表的应该是由"频道id(等价于频道名称)"、"节目名称"、"播出日期"3个字段来保证唯一性的,如果出现一天同一频道播出同一节目2次的情况,
则还要加上"节目播出时间"来保证唯一性。
3.逻辑上A、B表应该用"频道id"、"收看日期/播出日期"进行关联,但由于B表没有节目信息,因此关联的结果会产生冗余(A表关于"频道id"、"播出日期"不唯一)。
4.要解决3.的问题必须加上一个逻辑,即:节目播出开始时间<=节目收看开始时间<=节目收看结束时间<=节目播出结束时间。

还要请搂住确认下以上是否成立,如成立我可以用hash方式来处理下。


刚才想了下,判断一个节目是否收看应该是[节目播出开始时间,节目播出结束时间]与[节目收看开始时间,节目收看结束时间]之间存在交集。。。搂主是不是这样。

7
fenghuang828 发表于 2014-5-26 17:55:25
楼上的果然是高手,是这样的,如果节目的播出时间,正好有收看时间与之对应,那这条记录就是想要的,经过考虑 收看的开始时间,结束时间,与节目的开始时间,结束时间有四种关系,这4种关系的时长正好是需要的,而其他不需要的关联的时候设置为零就可以了

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

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