我一直在使用 BigQuery 公共数据集,即 bigquery-public-data.geo_international_ports.world_port_index。
我选择“国家/地区”和“港口大小”列,并计算国家/地区的总数。我将其添加为“harbor_size”列中值为“ALL”的新行。我想对这个总数进行排序,但在某种程度上,所有国家元素都集中在一起。原始 'harbor_size' 元素:['S', 'M', 'L', 'V'].
这是我到目前为止所拥有的:在此处输入图像描述
查询:
WITH
total_n AS
(
SELECT
country,
"ALL" AS harbor_size,
COUNT(country) as hb_count
FROM bigquery-public-data.geo_international_ports.world_port_index
GROUP BY country
ORDER BY country ASC, hb_count DESC
)
SELECT * FROM total_n
UNION ALL
SELECT
country,
harbor_size,
COUNT(country) as hb_count
FROM bigquery-public-data.geo_international_ports.world_port_index
GROUP BY country, harbor_size
ORDER BY country ASC, hb_count DESC;
所以最后,我想要拥有某物。像这样:
国家 | h_尺寸 | 数 | 备注 |
---|---|---|---|
美国 | 全部 | 10,000 | <- sort on this |
美国 | L | 7,000 | |
美国 | M | 2,000 | |
美国 | S | 1,000 | |
CA | 全部 | 9,000 | <- sort on this |
CA | L | 6,000 | |
CA | M | 2,000 | |
CA | S | 1,000 | |
... | ... | ... | ... |
我正在考虑在“harbor_size”中创建只有“ALL”的临时表,然后在排序后添加索引,以便每个国家都有一个索引,然后将其与另一个表(国家,harbor_size w/所有元素,计数)联合起来按索引排序。
您还没有说明您的查询的问题。事实上,它应该工作得很好,除了那些只有一种港口大小的国家/地区,因为这样“所有”行和大小行将具有相同的计数并最终任意排序。只需为此案例添加一个排序条件即可完成。
CTE 中的
ORDER BY
子句是多余的,因为子查询结果是无序数据集。 DBMS 可以完全忽略此子句。
您可以通过
ROLLUP
获得总数。这使得查询更简单:
SELECT
country,
COALESCE(harbor_size, 'ALL') AS hb_size,
COUNT(*) as hb_count
FROM bigquery-public-data.geo_international_ports.world_port_index
GROUP BY ROLLUP(country)
ORDER BY country ASC, hb_count DESC, hb_size ASC;