为什么我的列别名在子查询中不起作用?

Why is my column alias not working in subquery?

我正在尝试 运行 下面的 Snowflake 代码:

SELECT 
agg_zone_delivery_metrics_hourly.zone_code,
agg_zone_delivery_metrics_hourly.start_of_period_local_date,
MIN(CASE WHEN azdmh.start_of_period_local_hour_of_day = '18' THEN agg_zone_delivery_metrics_hourly.throughput_actual END) AS TP18,
MIN(CASE WHEN azdmh.start_of_period_local_hour_of_day = '19' THEN agg_zone_delivery_metrics_hourly.throughput_actual END) AS TP19,
MIN(CASE WHEN azdmh.start_of_period_local_hour_of_day = '20' THEN agg_zone_delivery_metrics_hourly.throughput_actual END) AS TP20
FROM (
SELECT 
    CAST(EXTRACT(HOUR FROM CAST(agg_zone_delivery_metrics_hourly.START_OF_PERIOD_LOCAL  AS TIMESTAMP)) AS INT) AS "azdmh.start_of_period_local_hour_of_day",
    TO_CHAR(TO_DATE(agg_zone_delivery_metrics_hourly.START_OF_PERIOD_LOCAL ), 'YYYY-MM-DD') AS "agg_zone_delivery_metrics_hourly.start_of_period_local_date",
    agg_zone_delivery_metrics_hourly.ZONE_CODE  AS "agg_zone_delivery_metrics_hourly.zone_code",
    nullif(sum(agg_zone_delivery_metrics_hourly.orders_delivered), 0) / nullif(sum(agg_zone_delivery_metrics_hourly.rider_hours_worked_dhw_sum), 0)
       AS "agg_zone_delivery_metrics_hourly.throughput_actual"
FROM tblB  AS agg_zone_delivery_metrics_hourly

WHERE ((((agg_zone_delivery_metrics_hourly.START_OF_PERIOD_LOCAL ) >= ((DATEADD('day', -7, DATE_TRUNC('week', DATE_TRUNC('day', CONVERT_TIMEZONE('UTC', 'Hongkong', CAST(CURRENT_TIMESTAMP() AS TIMESTAMP_NTZ))))))) AND (agg_zone_delivery_metrics_hourly.START_OF_PERIOD_LOCAL ) < ((DATEADD('day', 7, DATEADD('day', -7, DATE_TRUNC('week', DATE_TRUNC('day', CONVERT_TIMEZONE('UTC', 'Hongkong', CAST(CURRENT_TIMESTAMP() AS TIMESTAMP_NTZ))))))))))) AND (((CASE TO_CHAR(agg_zone_delivery_metrics_hourly.START_OF_PERIOD_LOCAL , 'DY')
WHEN 'Tue' THEN 'Tuesday'
WHEN 'Wed' THEN 'Wednesday'
WHEN 'Thu' THEN 'Thursday'
WHEN 'Sat' THEN 'Saturday'
ELSE TO_CHAR(agg_zone_delivery_metrics_hourly.START_OF_PERIOD_LOCAL , 'DY') || 'day' END) = 'Sunday')) AND (CAST(EXTRACT(HOUR FROM CAST(agg_zone_delivery_metrics_hourly.START_OF_PERIOD_LOCAL  AS TIMESTAMP)) AS INT) IN (20,18,19)) AND (agg_zone_delivery_metrics_hourly.COUNTRY_NAME = 'Hong Kong') AND agg_zone_delivery_metrics_hourly.is_within_zone_hours AND (agg_zone_delivery_metrics_hourly.COUNTRY_NAME = 'Hong Kong')
GROUP BY 1,TO_DATE(agg_zone_delivery_metrics_hourly.START_OF_PERIOD_LOCAL ),3) AS tblA

但是,我收到以下错误:

SQL compilation error: error line 2 at position 0 invalid identifier 'AGG_ZONE_DELIVERY_METRICS_HOURLY.ZONE_CODE'

我认为这里的问题是代码无法识别子查询中的列别名。

如果您在 " 中包含一个别名,就像您对内部查询的列所做的那样,您也必须在 " 中包含任何引用并使用确切的名称(区分大小写) .

尝试

SELECT 
"agg_zone_delivery_metrics_hourly.zone_code",
...

(对其他列执行相同操作)。

或者删除别名周围的 " 并使用没有 . 的别名,这无论如何都会造成混淆。

这与您使用的 table 别名有关。这种别名:

AS "agg_zone_delivery_metrics_hourly.throughput_actual"

令人困惑,因为:

  • 如果您在 table 别名中使用双引号 « " »,则必须在每个引用此别名的表达式中使用它们

  • 点 (« . ») 通常用于将 table 别名与列名分开,例如 « table.column »

较短的解决方案是将所有对这些怪异别名的引用也用双引号引起来。

但是,为了便于阅读和维护,最好更改您的 table 别名,方法是删除双引号并将点替换为另一个字符(通常使用下划线)。上面可以改成:

AS agg_zone_delivery_metrics_hourly_throughput_actual

PS1:您应该考虑改进查询的格式,因为它很难阅读。

PS2:您的查询还有其他问题。也就是说,您的顶级查询中有聚合函数 (« SUM... ») 但没有 « GROUP BY » 子句:这将不起作用。您需要在查询末尾添加一个 GROUP BY 子句,它引用输出中的非聚合列,例如:

GROUP BY
    agg_zone_delivery_metrics_hourly.zone_code,
    agg_zone_delivery_metrics_hourly.start_of_period_local_date,