sqladvance,创建用coditional值填充新列

30byixjq  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(402)

请您支持下面的问题,我试图在sql查询中根据条件值填充一个新列。
伪代码:

  1. IF ap_id exists in visit_table and visit_type = 'first'
  2. then firs_tvisit_id = visit_table.visit_id and first_visit_user = visit_table.Username

第二次和第三次访问的逻辑相同。
这是你的table。

这是apu表(键值在哪里):

下面是预期的表格。

sql能够进行这种数据操作,如果有的话我怎么能得到这个。
我试过左连接、内连接和外连接。然而,我无法创建一个新的列,并填充在一个条件的基础上。

ltqd579y

ltqd579y1#

一种方法是多重的 join 学生:

  1. select a.*,
  2. v1.visit_id, v1.user_name,
  3. v2.visit_id, v2.user_name,
  4. v3.visit_id, v3.user_name
  5. from ap_table a left join
  6. visit_table v1
  7. on v1.ap_id = a.ap_id and v1.type = 'first' left join
  8. visit_table v2
  9. on v2.ap_id = a.ap_id and v2.type = 'second' left join
  10. visit_table v3
  11. on v3.ap_id = a.ap_id and v3.type = 'third'
k0pti3hp

k0pti3hp2#

您可以加入并执行条件聚合:

  1. select
  2. a.ap_id,
  3. a.location,
  4. max(case when visit_type = 'first' then visit_id end) first_visit_id,
  5. max(case when visit_type = 'second' then visit_id end) second_visit_id,
  6. ...
  7. max(case when visit_type = 'first' then username end) first_visit_username,
  8. max(case when visit_type = 'second' then username end) second_visit_username,
  9. ...
  10. from ap_table a
  11. inner join visit_table v on v.ap_id = a.ap_id
  12. group by a.ap_id, a.location
mhd8tkvw

mhd8tkvw3#

看起来您这里有一些潜在的数据问题,必须得到正确解决。更具体地说,如果visit\u表中有多条记录的ap\u id和visit\u类型相同,该怎么办?或者我们应该假设这两列上有一个唯一的键吗?
这个问题的最佳答案实际上可能取决于您所使用的sql的风格以及您真正想要做的事情的细微差别。例如,postgresql能够在不需要分组的情况下“选择不同的”列。oracle、sqlserver和其他一些工具能够使用with子句简化复杂的查询。如果其他方法失败,您可以编写嵌套查询,尝试在一个monster查询中获取所有内容。
如果您能够使用临时表或表变量,则最好根据需要将信息选择到构造的表中。如果需要3次以上的访问,则可能需要编写动态sql。如果这是您希望随时可供其他查询访问的信息,您可以考虑将其编写为视图。
关于简单地选择min(访问id)和min(用户名)进行查询的一个简短说明-如果您有多个分组行,您很可能会从一次访问中获得的id与另一次访问的用户名不正确地配对。
下面尝试为3种访问类型创建一个monster查询,包括:

  1. SELECT a.ap_id,
  2. a.location,
  3. v1.visit_id AS first_visit_id,
  4. v1.username AS first_visit_username,
  5. v2.visit_id AS second_visit_id,
  6. v2.username AS second_visit_username,
  7. v3.visit_id AS third_visit_id,
  8. v3.username AS third_visit_username
  9. FROM (
  10. SELECT ai.ap_id,
  11. (SELECT MIN(v1i.visit_id) FROM visit_table v1i ON v1i.ap_id = ai.ap_id AND v1i.type = 'first') AS v1_id,
  12. (SELECT MIN(v2i.visit_id) FROM visit_table v2i ON v2i.ap_id = ai.ap_id AND v2i.type = 'second') AS v2_id,
  13. (SELECT MIN(v3i.visit_id) FROM visit_table v3i ON v3i.ap_id = ai.ap_id AND v3i.type = 'third') AS v3_id
  14. FROM ap_table ai
  15. ) x
  16. JOIN ap_table a ON x.ap_id = a.ap_id
  17. LEFT JOIN visit_table v1 ON x.v1_id = v1.visit_id
  18. LEFT JOIN visit_table v3 ON x.v2_id = v2.visit_id
  19. LEFT JOIN visit_table v3 ON x.v3_id = v3.visit_id
  20. WHERE
  21. x.v1_id IS NOT NULL
  22. OR x.v2_id IS NOT NULL
  23. OR x.v3_id IS NOT NULL
展开查看全部

相关问题