BigQuery:如何根据一列中元素的总计对表进行排序,但元素不唯一

问题描述 投票:0回答:1

我一直在使用 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/所有元素,计数)联合起来按索引排序。

sql google-bigquery analytics
1个回答
0
投票

您还没有说明您的查询的问题。事实上,它应该工作得很好,除了那些只有一种港口大小的国家/地区,因为这样“所有”行和大小行将具有相同的计数并最终任意排序。只需为此案例添加一个排序条件即可完成。

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;
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.