【问题标题】:SQL Advance, creating fill new column with coditional valueSQL Advanced,使用条件值创建填充新列
【发布时间】:2020-06-22 20:48:45
【问题描述】:

请您支持下面的问题,我尝试根据条件值在我的 SQL 查询中填充一个新的列。

伪代码:

IF ap_id exists in visit_table and visit_type = 'first'
then firs_tvisit_id = visit_table.visit_id and first_visit_user = visit_table.Username
  • 第二次和第三次访问的逻辑相同。

这是 visit_table。

这是 ap_table(关键值在哪里):

下面是预期的表格。

SQL 能够进行这种数据操作,如果有的话,我怎么能得到这个。

我已经尝试过左连接、内连接和完全外连接。但是我无法创建一个新列并根据条件填充它。

【问题讨论】:

标签: sql join pivot


【解决方案1】:

一个方法是多个joins:

select a.*,
       v1.visit_id, v1.user_name,
       v2.visit_id, v2.user_name,
       v3.visit_id, v3.user_name
from ap_table a left join
     visit_table v1
     on v1.ap_id = a.ap_id and v1.type = 'first' left join
     visit_table v2
     on v2.ap_id = a.ap_id and v2.type = 'second' left join
     visit_table v3
     on v3.ap_id = a.ap_id and v3.type = 'third'

【讨论】:

    【解决方案2】:

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

    select
        a.ap_id, 
        a.location,
        max(case when visit_type = 'first' then visit_id end) first_visit_id,
        max(case when visit_type = 'second' then visit_id end) second_visit_id,
        ...
        max(case when visit_type = 'first' then username end) first_visit_username,
        max(case when visit_type = 'second' then username end) second_visit_username,
        ...
    from ap_table a
    inner join visit_table v on v.ap_id = a.ap_id
    group by a.ap_id, a.location
    

    【讨论】:

      【解决方案3】:

      您似乎有一些潜在的数据问题,必须解决这些问题才能找到正确的解决方案。更具体地说,如果 visit_table 有多个相同 ap_id 和 visit_type 的记录会发生什么?或者我们应该假设这两列上有一个唯一的键?

      发布的这个问题的最佳答案实际上可能取决于您使用的 SQL 的风格以及您真正尝试做的事情的细微差别。例如,PostgreSQL 能够“SELECT DISTINCT ON”列而不需要分组。 Oracle、SQL Server 等有能力simplify complex queries using the with clause。如果其他方法失败,您可以随时编写嵌套查询来尝试在一个怪物查询中获取所有内容。

      如果您能够使用temp tabletable variable,您最好根据需要将信息选择到构造表中。如果您需要超过 3 次访问,您可能需要写信 dynamic sql。如果您希望这些信息随时可供其他查询访问,您可以考虑将其写为view

      关于简单地为您的查询选择 min(visit_id) 和 min(username) 的快速说明 - 如果您有多个分组的行,您可能会从一次访问中获取 id 与另一次访问中的用户名不正确地配对。

      这里尝试为包括的 3 种访问类型创建一个怪物查询:

      SELECT a.ap_id,
        a.location,
        v1.visit_id AS first_visit_id,
        v1.username AS first_visit_username,
        v2.visit_id AS second_visit_id,
        v2.username AS second_visit_username,
        v3.visit_id AS third_visit_id,
        v3.username AS third_visit_username
      FROM (
        SELECT ai.ap_id,
          (SELECT MIN(v1i.visit_id) FROM visit_table v1i ON v1i.ap_id = ai.ap_id AND v1i.type = 'first') AS v1_id,
          (SELECT MIN(v2i.visit_id) FROM visit_table v2i ON v2i.ap_id = ai.ap_id AND v2i.type = 'second') AS v2_id,
          (SELECT MIN(v3i.visit_id) FROM visit_table v3i ON v3i.ap_id = ai.ap_id AND v3i.type = 'third') AS v3_id
        FROM ap_table ai
      ) x
      JOIN ap_table a ON x.ap_id = a.ap_id
      LEFT JOIN visit_table v1 ON x.v1_id = v1.visit_id
      LEFT JOIN visit_table v3 ON x.v2_id = v2.visit_id
      LEFT JOIN visit_table v3 ON x.v3_id = v3.visit_id
      WHERE
        x.v1_id IS NOT NULL
        OR x.v2_id IS NOT NULL
        OR x.v3_id IS NOT NULL
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-10
        • 2017-06-17
        • 1970-01-01
        • 2017-02-26
        • 1970-01-01
        • 2023-03-21
        • 2021-02-24
        • 2020-08-11
        相关资源
        最近更新 更多