8.7 定位赋值法行转列
定位赋值行转列,动态生成新序表数据结构,最后根据行列位置直接赋值。
根据用户记录,动态生成用户列,统计用户每周在线情况。根据相互关联的用户表和记录表中,汇总统计 2018 年每周用户的活动情况:
User |
---|
ID |
Name |
Record |
---|
ID |
Date |
想要显示 2018 年每周用户是否有活动的记录,如下表:
Week | User1 | User2 | User3 |
---|---|---|---|
1 | Yes | No | Yes |
2 | Yes | Yes | No |
3 | Yes | No | Yes |
4 | No | Yes | Yes |
先创建目标数据结构,再往里面填数据。
脚本:
A | |
---|---|
1 | =connect(“db”).query@x(“select t1.ID as ID, t1.Name as Name, t2.Date as Date from User t1, Record t2 where t1.ID=t2.ID and year(t2.Date)=2018”) |
2 | =A1.derive(interval@w(“2018-01-01”,Date)+1:Week) |
3 | =A2.group(ID) |
4 | =A2.max(Week) |
5 | =A4.new(~:Week,${A3.(“"No":”+Name).concat@c()}) |
6 | =A3.run(~.run(A5(Week).field(A3.#+1,“Yes”))) |
A1:查询用户表和记录表,按用户 ID 连接。
A2:根据日期计算出周序号,存放在新字段 Week。
A3:按照用户 ID 进行分组。
A4:找到最大的周序号。
A5:根据最大的周序号创建一个空序表,赋予缺省值 "No"。
A6:每组每条数据,通过周序号在目标表中定位到对应记录,替换该用户值为 "Yes"。