【问题标题】:Keep variables in the SELECT list which are not used in the GROUP BY nor aggregated在 SELECT 列表中保留未在 GROUP BY 中使用或聚合的变量
【发布时间】:2021-10-22 15:38:08
【问题描述】:

我有 2 个表:table1(包括 id、title 和 abstract)和 table2(包括 id、pubdate 和 family_id)。

每个 id 都是唯一的,但多行可以有相同的 family_id。

我的目标是仅显示每个 family_id 的 MIN(pubdate) 的 id、title 和 pubdate,以便我应该得到:

我试过了:

SELECT
  t1.id, t1.title, nt2.pubdate
FROM
  (SELECT
     id, family_id, MIN(pubdate) AS pubdate
   FROM
     table2
   GROUP BY
     family_id) AS nt2
INNER JOIN
  table1 t1
ON
  t1.id = nt2.id

我在 BigQuery 中收到以下错误消息:“SELECT list expression references column id which is not grouped or aggregated at [position]”。

我读到here,这是因为相应 SELECT 列表中的所有表达式都必须是 GROUP BY 中的表达式,或者应该具有 AGGREGATION 函数。

但是,我确实需要 id 才能与 table1 合并。

我该怎么做?

【问题讨论】:

标签: mysql sql


【解决方案1】:

在“Group by”语句中,您需要编写在“SELECT”语句中使用的所有字段。你可以看到这个documentation

喜欢这行代码:

GROUP BY Family_id,id

在这种情况下,如果family和id在另一个字段中重复,它们将分组。

这是一个示例代码:

SELECT
  t1.id, t1.title, nt2.pubdate
FROM
  (
  Select B.* 
  from (
        SELECT
        family_id, MIN(pubdate) AS pubdate
        FROM
            table2
        GROUP BY
            family_id
      ) as A 
        inner join table2  B on A.pubdate = B.pubdate and A.family_id=B.family_id
    ) AS nt2
INNER JOIN
  table1  t1
ON
  t1.id = nt2.id

【讨论】:

  • 您的解决方案不起作用。如果我应用它,它将为从 1 到 5 的所有 id 选择 id、title 和 pubdate,这不是我想要的,我只需要选择 id 1、3 和 5。我用表格的一些插图完成了我的问题和我需要的结果。
  • 您好,已经更改了查询,在子查询中,您只需要使用这两个字段 min(pubdate) 和 family_id 和 group by 仅使用这两个字段。并使用与 table2 的连接来获取表的 id。有什么问题可以问我。
  • 好的,现在可以了。因此,解决方案是添加一个额外的 INNER JOIN 来获取与表 1 合并的 id。谢谢。
【解决方案2】:

根据您的描述,您似乎可以在table2 中拥有一个id 和多个pubdate 然后,您必须选择与最旧的pubdate 关联的id 将其添加到group by 子句中,它不会影响id。
试试

SELECT
  t1.id, t1.title, nt2.pubdate
FROM
  (SELECT
     id, family_id, MIN(pubdate) AS pubdate
   FROM
     table2
   GROUP BY
     id, family_id) AS nt2
INNER JOIN
  table1 t1
ON
  t1.id = nt2.id

对于每个family_id,您将拥有最老的idtitlepubdate (只要您不将其放在选择中,后者就不会出现在您的决赛桌中子句)

【讨论】:

  • 你明白我的意思,但是,作为以前的解决方案,它不起作用。如果我应用它,它将为从 1 到 5 的所有 id 选择 id、title 和 pubdate,这不是我想要的,我只需要选择 id 1、3 和 5。我用表格的一些插图完成了我的问题和我需要的结果。
【解决方案3】:

考虑以下方法

select id, title, pubdate
from table2 
join table1 using(id)
where true 
qualify 1 = row_number() over(partition by family_id order by pubdate)    

如果应用于您问题中的样本数据 - 输出是

【讨论】:

  • 最后一行出现语法错误。
  • 如果您按原样运行上述查询 - 您不会收到任何错误!你修改过查询吗?你到底遇到了什么错误?
  • 不,我没有修改任何东西。我在 MySQL 5.6 中遇到语法错误,但我不能说更多。在这里,这是一个在线 SQL 测试网站的链接,其中包含我的数据示例和您的代码:sqltest.net/#1489401
  • 那么为什么要用 bigquery 标记你的问题呢?
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多