如何选择第 n 列,并在 BigQuery 中对列的选择进行排序

Posted

技术标签:

【中文标题】如何选择第 n 列,并在 BigQuery 中对列的选择进行排序【英文标题】:How to select the nth column, and order columns' selection in BigQuery 【发布时间】:2021-02-25 12:02:02 【问题描述】:

我有一个巨大的表,我在上面应用了大量处理(使用 CTE),我想在 2 个特定的 CTE 上执行 UNION ALL。

SELECT  *
        , 0 AS orders
        , 0 AS revenue
        , 0 AS units
FROM secondary_prep_cte WHERE purchase_event_flag IS FALSE
UNION ALL
SELECT  *
FROM results_orders_and_revenues_cte

我收到了"Column 1164 in UNION ALL has incompatible types : STRING,DATE at [97:5]

显然我不知道列的名称,我想调试它,但我觉得如果我无法确定哪一列是 1164,我会浪费很多时间。 我也认为这是CTE之间的列顺序问题,所以我有2个问题:

    如何识别第 1164 列 如何在执行 UNION ALL 之前对列进行排序

我找到了this similar question,但它适用于 MSSQL,我正在使用 BigQuery

【问题讨论】:

执行create table as select 并比较具有相同序号位置的列的数据类型。但是最好明确指定列,直到您真正从具有不同过滤器的相同源中进行选择。 【参考方案1】:

您可以从INFORMATION_SCHEMA.COLUMNS 获取信息,但您需要从 CTE 创建表或视图:

CREATE OR REPLACE VIEW `project.dataset.secondary_prep_view` as select * from (select 1 as id, "a" as name, "b" as value)

然后:

SELECT * FROM dataset.INFORMATION_SCHEMA.COLUMNS WHERE  table_name = 'secondary_prep_view';

【讨论】:

好了,第一个问题就解决了。第二个是与UNION ALL 提出真正问题的那个,我可以在SELECT 语句中一一写出这些列,但这很难看,而且难以维护 @Aetos 您可以在第一个视图上使用查询来按顺序获取列名 (SELECT STRING_AGG(column_name order by ordinal_position) FROM dataset.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'secondary_prep_view'),然后使用结果创建第二个以重新排序它们。或者使用动态SQL,见BigQuery Scripting

以上是关于如何选择第 n 列,并在 BigQuery 中对列的选择进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中按日期列排序的组中对列进行排名

iview中对列标题头进行格式渲染render

BigQuery:超过对列分区表的分区修改次数的配额

SonataAdminBundle 如何在列表视图中对列的值求和

在MS Access中对列标题进行分组

如何在 Jaspersoft iReport Designer 中对列中的所有值求和?