在BigQuery中何时使用和不使用别名



我使用公共数据库中的citibike_stations和citibike_trips并复制了这些表。所以我有:数据集:Citibike_stations1表格-车站和行程。

下面是我得到错误的查询- "未识别的名称:

选择st.station_id,st.name,number_of_rides作为number_of_rides_fromstation,
doubt1- number_of_rides不是列,那么SQL如何选择这个
FROM (选择start_station_id,number_of_rides COUNT (*)从leafy-racer-348015.citibike_stations1.tripstr组由start_station_id)作为station_num_trips内连接leafy-racer-348015.citibike_stations1.stationsst ONSt.station_id = tr.start_station_id命令number_of_rides DESC

Doubt2 -当我运行这个查询时,我在st.station_id=tr.start_station_id行中得到不可识别的错误。但是如果我去掉这个别名,它就可以正常工作了

我指的是这个问题从谷歌数据分析课程Wk3嵌套查询模块。在JOIN模块的前面,我了解别名是JOIN函数工作所必需的。但这里是相反的。为什么?

好的,我想我已经设法弄清楚这是什么问题。首先,让我们格式化你的查询,使其清晰(但仍然有错误):

SELECT 
st.station_id, 
st.name, 
number_of_rides AS number_of_rides_fromstation,
FROM 
( 
SELECT start_station_id, COUNT(*) as number_of_rides 
FROM leafy-racer-348015.citibike_stations1.trips tr 
GROUP BY start_station_id 
) station_num_trips 
INNER JOIN leafy-racer-348015.citibike_stations1.stations st 
ON 
st.station_id = tr.start_station_id 
ORDER BY number_of_rides DESC

number_of_rides不是列,那么SQL如何选择这个

当然是。station_num_trips别名子查询由COUNT(*)生成

SQL只是"输入矩形数据块,输出矩形数据块";-每个SELECT都会产生一个矩形数据块,就像一个表一样,可以将其馈送到另一个操作中,如JOIN, FROM或WHERE。如果它是单个值,它甚至可以被输入到SELECT中。这里的子查询:

( 
SELECT start_station_id, COUNT(*) as number_of_rides 
FROM leafy-racer-348015.citibike_stations1.trips tr 
GROUP BY start_station_id 
) station_num_trips 

. .取trips中的所有数据,除去站点id之外的所有列,计算从该站点出发的行程数,并生成一个新的数据块station idcount:它测量2列宽N行高(N是唯一站点id的数量)。这是当你进行连接时被连接的东西;2宽N高的数据块

Trips可能有1000行相同的站点ID和10列;它们都消失了,折叠成1行,2列,其中一行计数为1000。现在它的行为就像一个名为station_num_trips

的新表,

每一步都添加或删除列和行,所以基本上你在SQL中所做的就是切割,并将数据块连接在一起,以形成新的数据块。

表通常构成起始块,但它们不一定要这样做:

SELECT * FROM (SELECT 1 as A UNION SELECT 2) x

这是完全有效的;您可以应用where子句来删除行,对表应用JOIN来添加更多列,然后选择这些新列或使用它们来生成更多计算值


在子查询中将表混叠是没有意义的;只有一个表,所以很明显你指的是什么:

( 
SELECT start_station_id, COUNT(*) as number_of_rides 
FROM leafy-racer-348015.citibike_stations1.trips       --removed alias
GROUP BY start_station_id 
) station_num_trips 

混叠还会导致另一个错误:

当我运行这个查询时,我在st.station_id=tr.start_station_id行中得到了不可识别的错误。但是如果我去掉这个别名,它就可以正常工作了

tr是子查询中的别名。它并不存在于你使用它的地方。整个子查询的别名为station_num_trips,因此在连接条件中需要使用的是station_num_trips.start_station_id,而不是tr.start_station_idtr别名消失了;不能从包装子查询的父查询访问子查询的别名。

但是,您可以在子查询中访问父查询的别名(与您所拥有的相反)

SELECT *              
FROM table1 x         <-- this is the parent query
WHERE 
EXISTS(SELECT null FROM table2 y WHERE x.id = y.id)
^^^
from the parent query

这样做是协调子查询数据与主查询数据的常用方法。在这里,这个查询要求"只获取x条记录,在表2中有匹配的记录"。-它需要子查询和主查询之间的协调才能工作


使用缩进来保持你的头脑中什么是父查询,什么是子查询。小的子查询可以放在一行中,或者以block关键字作为每行的前导的紧凑形式。较大的查询应该展开:

SELECT
smiths.columnX,
counted_things.column3,
SUM(x.yz)
FROM
(SELECT * FROM People WHERE name = 'SMITH') smiths
JOIN (
SELECT name, age, column3, COUNT(*) as columnX
FROM TableA JOIN tableB On x = y
WHERE column4 = 'something'
GROUP BY name, age, column3
) counted_things
ON 
counted_things.name = smiths.Name AND 
counted_things.age = smiths.Age AND
..
JOIN sometable x ON x.whatever = counted_things.whatever
JOIN anothertable y
ON
x.id = y.id AND
...
WHERE
x.thing = 123
GROUP BY
smiths.columnX,
counted_things.column3

看看我是如何使用缩进来描述所有内容的操作级别-SELECT FROM WHERE GROUP等都对齐;它们属于同一个查询。FROM中的数据块彼此缩进并对齐;子查询的括号与其他括号和表名对齐。挑选子查询很容易。很容易看出它连接的是什么;smiths, counted_things, sometable and anothertable缩进相同,它们连接在一起,在同一层操作。子查询在括号内缩进,以明确它们是子查询

所有这些都有助于您使用诸如"子查询可以访问父别名,但不能访问父别名"之类的规则;子查询生成的行和列的行为类似于新表

相关内容

  • 没有找到相关文章

最新更新