分组后转置
分组后转置
【问题】
i need help with this i try to think about resolve this but i cant find how resolve with mysql, I need if the users have record in the week, and show this result with this form:
user 1 | user 2 | user 3 | |
---|---|---|---|
week 1 | yes | no | yes |
week 2 | yes | yes | no |
week 3 | yes | no | yes |
week 4 | no | yes | yes |
week 5 | yes | no | no |
week 6 | yes | no | yes |
I have table user and table record
TABLES | FIELDS |
---|---|
user | id |
name | |
record | id_user |
date |
【回答】
提问者告诉我们有两个表:一是用户表,二是活动记录表。后者表示用户在某日存在一条某活动的记录。问题是如何表示出用户每周是否有活动的记录,并以问题开头的样式表达出来:有记录就标记为 yes,没有就是 no。
SQL 中虽然可以静态列转置,但此问题不是统计问题,一个用户会有多个日期记录,转置不能满足我们的要求;再加上需要动态将日期转化为周序号作为条件来判断,不能轻松地用 SQL 来实现查询。用 SPL 解决这个问题可以这样做:
A | |
---|---|
1 | =connect("test") |
2 | =A1.query("select user.name,record.date,record.id_user from user, record where record.id_user=user.id").run(date=interval@w("2018-11-1",date)+1) |
3 | =A2.group(id_user) |
4 | =A3.max(date).new(~:week,${A3.("\"No\":"+name).concat@c()}) |
5 | =A3.run(~.run(A4(date).field(A3.#+1,"Yes"))) |
A1: 连接 test 数据库。
A2:查询 user 表和 record 表,将用户名和日期对应起来。将日期翻译成乘对应的周序号。
A3:根据用户 id 分组。每一组都是改组对应用户的”用户名”和“日期记录”的序列。
A4:根据 A2 找到最大周序号,并生成一个序表,含有周序号列和用户名列,用户名列的数量是根据 A3 的分组动态生成的。初始设定所有用户名列的值为“No”。
A5:根据 A3 的每组每条数据计算其在 A4 中对应的周序号——即对应 A4 第 n 条数据,用 A4(n) 取得该条目,替换其 A3 当前这个用户的值为”Yes”。
最终我们在 A4 格看到要求的结果。
A2
A3
A4
A4 结果