Sql 在BigQuery中,如何获取两行**和**差异所在字段的名称之间的差异?

Sql 在BigQuery中,如何获取两行**和**差异所在字段的名称之间的差异?,sql,google-bigquery,Sql,Google Bigquery,我在BigQuery中有这样一个表: 名称 电话号码 住址 约翰 123456778564 便士巷1号 约翰 873452987424 便士巷1号 玛丽 845704562848 第五大道87号 玛丽 845704562848 林肯路54号。 艾米 342847327234 海洋大道4号 艾米 347907387469 杜鲁门路98号。 一种方法是使用lag和union all 一种方法是使用lag和union all 考虑下面这个大问题的解决方案 select Name, ['Phone Nu

我在BigQuery中有这样一个表:

名称 电话号码 住址 约翰 123456778564 便士巷1号 约翰 873452987424 便士巷1号 玛丽 845704562848 第五大道87号 玛丽 845704562848 林肯路54号。 艾米 342847327234 海洋大道4号 艾米 347907387469 杜鲁门路98号。
一种方法是使用lag和union all


一种方法是使用lag和union all


考虑下面这个大问题的解决方案

select Name, ['Phone Number', 'Address'][offset(offset)] Field, 
  prev_field as Before, field as After
from (
  select timestamp, Name, offset, field,
    lag(field) over (partition by Name, offset order by timestamp) as prev_field
  from yourtable,
  unnest([`Phone Number`, Address]) field with offset
)
where prev_field != field          
如果应用于问题中的样本数据,则输出为

正如您在这里所看到的,无论需要比较表中的多少列,它仍然只是一个查询,没有联合等。 您只需要在两个位置枚举列

['Phone Number', 'Address'][offset(offset)] Field   


注意:您可以使用脚本的execute immediate在上面进一步重构,以便在查询中动态地组成这样的列表检查我的其他答案-我经常在其中使用这样的技术

select Name, ['Phone Number', 'Address'][offset(offset)] Field, 
  prev_field as Before, field as After
from (
  select timestamp, Name, offset, field,
    lag(field) over (partition by Name, offset order by timestamp) as prev_field
  from yourtable,
  unnest([`Phone Number`, Address]) field with offset
)
where prev_field != field          
如果应用于问题中的样本数据,则输出为

正如您在这里所看到的,无论需要比较表中的多少列,它仍然只是一个查询,没有联合等。 您只需要在两个位置枚举列

['Phone Number', 'Address'][offset(offset)] Field   


注意:您可以使用脚本的execute immediate在上面进一步重构,以便在动态查询中组成这样的列表检查我的其他答案-我经常在它们中使用这种技术

SQL表表示无序集。除非列指定了顺序,否则没有before和after。假设我有一个timestamp字段@GordonLinoffSQL表也表示无序集。除非列指定排序,否则没有前后字段。假设我还有一个时间戳字段@gordonlinoff,非常感谢!这个很好用!但是,您知道如何获取表中所有列的名称,而不是写入每一列吗?我尝试使用INFORMATION\u SCHEMA.COLUMNS,但没有成功@我回答的最后一句话是:非常感谢你!这个很好用!但是,您知道如何获取表中所有列的名称,而不是写入每一列吗?我尝试使用INFORMATION\u SCHEMA.COLUMNS,但没有成功@MikhailBerlyantsee我回答的最后一句话是:o