如何选择第 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 中按日期列排序的组中对列进行排名