【问题标题】:how to select group having without actualy grouping items如何选择没有实际分组项目的组
【发布时间】:2019-02-14 22:02:58
【问题描述】:

我有一张这样设置的表:

doc product
a   2
a   1
a   1
b   1
c   3
c   2
d   1

我需要选择与订购产品 1 共享相同 doc id 的所有项目,但实际上并未对 doc 中的所有项目进行分组。

所以最终结果应该是这样的:

doc product
a   2
a   1
a   1
b   1
d   1

有没有办法实现这种类型的选择?

【问题讨论】:

    标签: mysql google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT *
    FROM `project.dataset.table`
    WHERE doc IN (SELECT DISTINCT doc FROM `project.dataset.table` WHERE product = 1)  
    

    以及纯 BigQuery 特定选项(用于娱乐和学习):

    #standardSQL
    SELECT doc, product 
    FROM (
      SELECT doc, ARRAY_AGG(product) arr
      FROM `project.dataset.table`
      GROUP BY doc
      HAVING 1 IN UNNEST(arr)
    ) t, t.arr product
    

    【讨论】:

    • 上次我被否决是很久以前的事了。试图弄清楚究竟是什么反对 o( 很高兴知道
    【解决方案2】:

    您有什么理由不想在这里使用普通的联接或子查询?

    类似于以下内容:

    Select * from table where doc in (
      select doc from table where product = 1
    ) t1 ;
    

    【讨论】:

      【解决方案3】:
      SELECT *
      FROM yourTable
      WHERE doc IN (
          SELECT doc
          FROM yourTable
          WHERE product = 1)
      

      子查询查找订购产品 1 的所有文档。然后主查询查找包含这些文档的所有行。

      SELECT t1.*
      FROM yourTable AS t1
      JOIN (
          SELECT DISTINCT doc
          FROM yourTable
          WHERE product = 1) AS t2
      ON t1.doc = t2.doc
      

      需要DISTINCT 以防止将所有行复制到子查询返回doc 的次数。

      如果表很大,我推荐第二种方法,因为 MySQL 在WHERE xxx IN (subquery) 查询方面存在一些臭名昭著的性能问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-10
        • 2021-07-22
        • 2020-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-13
        相关资源
        最近更新 更多