我在BigQuery中有两个表:
大多数包含城市名称的StationNames。现在我想从Station Table中提取城市。 这里有一些示例数据:
我尝试了INSTR功能,但没有成功(INSTR仅适用于Legacy SQL,我不能使用SUBSELECTS。)
SELECT City,
INSTR((SELECT AdGroupName
FROM [invertible-fin-XXX238.Reports.City]),City) AS Match
FROM [invertible-fin-XXX238.Reports.Station]
因此我尝试了WHERE LIKE。在SQL代码下面:
SELECT a.City
FROM [invertible-fin-XXX238.Reports.City] a
CROSS JOIN [invertible-fin-XXX238.Reports.Station] b
WHERE b. Name LIKE '%' + a.City + '%'
GROUP BY a.City
但是现在查询的计算量太大了,我得到了错误代码“查询超出了第1层的资源限制。需要第18级或更高级别。”返回。
有些人可以帮助我,写一个更加资源友好的查询。
提前致谢, 菲利普
答案 0 :(得分:1)
以下是BiigQuery Standard SQL
的许多可能版本中的一小部分#standardSQL
SELECT city, station
FROM `invertible-fin-XXX238.Reports.Station` AS s
JOIN `invertible-fin-XXX238.Reports.City` AS c
ON REPLACE(LOWER(station), LOWER(city), '') <> LOWER(station)
或
#standardSQL
SELECT city, station
FROM `invertible-fin-XXX238.Reports.Station` AS s
JOIN `invertible-fin-XXX238.Reports.City` AS c
ON LOWER(station) LIKE CONCAT('%',LOWER(city),'%')
如果City的名称在两个表格中的拼写相同,则可以删除LOWER()函数
虽然上面的版本看起来更直接 - 我更喜欢下面的一个,因为它允许你从车站提取城市的控制方式 - r'([^ _]+)'
- 你应该观察到的所有字符都是列站中的分隔符。所以在这种情况下,当它不是较长名称的一部分时,你将只提取城市
当然,你应该验证你是否需要担心这个
#standardSQL
WITH tokens AS (
SELECT token, station
FROM `invertible-fin-XXX238.Reports.Station` AS s,
UNNEST(REGEXP_EXTRACT_ALL(LOWER(station), r'([^ _]+)')) token
)
SELECT city, station
FROM tokens AS s
JOIN `invertible-fin-XXX238.Reports.City` AS c
ON LOWER(city) = token
答案 1 :(得分:0)
我也想知道在这种情况下子查询的性能如何。例如:
WITH City AS(
SELECT 'Berlin' As Name UNION ALL
SELECT 'Hamburg'
),
StationNames AS(
SELECT 'inStore_Berlin_Alexanderplatz' AS Name UNION ALL
SELECT 'Berlin Schönefeld Airport' UNION ALL
SELECT 'Train Station Franchise Berlin' UNION ALL
SELECT 'Train Station Hamburg' UNION ALL
SELECT 'Train Station Pluton'
)
SELECT
Name StationName,
(SELECT Name FROM City c WHERE LOWER(s.Name) LIKE CONCAT('%', LOWER(c.Name), '%')) city
FROM StationNames s
或者在你的情况下:
SELECT
Name StationName,
(SELECT Name FROM `invertible-fin-XXX238.Reports.City` c WHERE LOWER(s.Name) LIKE CONCAT('%', LOWER(c.Name), '%')) city
FROM `invertible-fin-XXX238.Reports.Station` s
我知道大多数数据库JOIN
比子查询具有更好的性能但BigQuery有很多different optimization techniques用于存储和查询数据是常识,我很想知道性能有多么不同在这种情况下。