如何做嵌套SQL选择计数

时间:2015-04-09 15:49:07

标签: sql count google-bigquery

我正在查询一个不允许使用 DISTINCT 的系统,所以我的另一种方法是做一个 GROUP BY 来接近结果

我想要的查询看起来像这样,

SELECT 
SUM(column1) AS column1,
SUM(column2) AS column2,
COUNT(DISTINCT(column3)) AS column3
FROM table

替代方案,我认为我需要某种类型的嵌套查询,

SELECT 
SUM(column1) AS column1,
SUM(column2) AS column2,
COUNT(SELECT column FROM table GROUP BY column) AS column3
FROM table

但它不起作用。我接近了吗?

4 个答案:

答案 0 :(得分:2)

您使用COUNT(DISTINCT)的错误语法。 DISTINCT部分是关键字,而不是函数。基于the docs,这应该有效:

SELECT 
  SUM(column1) AS column1,
  SUM(column2) AS column2,
  COUNT(DISTINCT column3) AS column3
FROM table

然而,请阅读文档。 BigQuery的COUNT(DISTINCT)实现有点不寻常,显然可以更好地扩展大数据。如果您尝试计算大量不同的值,则可能需要指定第二个参数(您有固有的缩放问题)。

<强>更新

如果要计算大量不同的column3值,并且想要精确计数,那么也许您可以执行连接而不是将子查询放入选择列表中(BigQuery似乎不允许) ):

SELECT *
FROM (
    SELECT
      SUM(column1) AS column1,
      SUM(column2) AS column2
    FROM table
  )
  CROSS JOIN (
      SELECT count(*) AS column3
      FROM (
          SELECT column3
          FROM table
          GROUP BY column3
        )
    )

更新2

加入两个单排表并不是很贵,但@FelipeHoffa让我更多地考虑这个问题,我意识到我错过了一个更简单的解决方案:

SELECT
  SUM(column1) AS column1,
  SUM(column2) AS column2,
  COUNT(*) AS column3
FROM (
    SELECT
      SUM(column1) AS column1,
      SUM(column2) AS column2
    FROM table
    GROUP BY column3
  )

这个计算column1column2值的小计,按column3分组,然后对所有小计行进行计数和总计。感觉很好。

答案 1 :(得分:0)

FWIW,您尝试使用DISTINCT的方式并不是它通常使用的方式,因为它意味着显示唯一的行,而不是数据集中一列的唯一值。 GROUP BY更符合我认为你最终要完成的事情。

根据您的需要,您可以做一些事情。使用第二个查询,您需要修改子查询以获取计数,而不是实际值,例如:

SELECT 
SUM(column1) AS column1,
SUM(column2) AS column2,
(SELECT sum(1) FROM table GROUP BY column) AS column3
FROM table

或者,您可以对初始查询进行查询,如下所示:

SELECT sum(column1), sum(column2), sum(column4) from (
SELECT 
SUM(column1) AS column1,
SUM(column2) AS column2,
1 AS column4
FROM table GROUP BY column3)
GROUP BY column4

编辑:以上是通用SQL,不太熟悉Google Big Query

答案 2 :(得分:0)

您可以使用CTE

WITH result as (select column from table group by column)

SELECT 
SUM(column1) AS column1,
SUM(column2) AS column2,
Select Count(*) From result AS column3
FROM table

答案 3 :(得分:0)

您可以先运行GROUP BY,然后计算结果,而不是使用COUNT(DISTINCT),而是计算结果。

例如,莎士比亚每年使用的不同单词的数量:

SELECT corpus_date, COUNT(word) different_words
FROM (
  SELECT word, corpus_date
  FROM [publicdata:samples.shakespeare]
  GROUP BY word, corpus_date
)
GROUP BY corpus_date
ORDER BY corpus_date

作为奖励,我们添加一个列,用于标识每年编写的书籍:

SELECT corpus_date, COUNT(word) different_words, GROUP_CONCAT(UNIQUE(corpus)) books
FROM (
  SELECT word, corpus_date, UNIQUE(corpus) corpus
  FROM [publicdata:samples.shakespeare]
  GROUP BY word, corpus_date
)
GROUP BY corpus_date
ORDER BY corpus_date