SQL“分组依据”问题 - 我无法选择每一列

Posted

技术标签:

【中文标题】SQL“分组依据”问题 - 我无法选择每一列【英文标题】:SQL "group by" question - I can't select every column 【发布时间】:2010-10-08 01:32:18 【问题描述】:

我有一个数据库,其中每一行都有一个 id、一个 URL 和一个 XML。 ID 是唯一的,但 URL 列可以有重复项。 我需要所有的 URL,没有重复,对于每个 URL,我需要 id 和 XML。

如果我只询问 URL 和 ID,我会使用以下查询:

select URL, max(ID) as ID from T1 group by URL

一切都很好。

但是当我还想要 XML 时,我使用以下查询:

select URL, max(ID) as ID, XML from T1 group by URL

我收到以下错误:

ISC ERROR CODE:335544569
ISC ERROR MESSAGE:
Dynamic SQL Error
SQL error code = -104
user name required

我做错了什么?

谢谢,

迪克拉

感谢您的回答。我要补充说明: 如果 URL 重复,我不在乎会返回哪个。 但我需要让它们没有重复,即使行之间的 XML 不同。 有可能吗? 谢谢!

【问题讨论】:

“但我需要让它们没有重复,即使 XML 不同”我很好奇你为什么需要 XML,但不要关心重复的 URL 可能每个都有不同的 XML重复的行,因此您实际上会为检索到的 XML 获得“随机选择” 这是因为 XML 的细节对于两行都是相同的,但它们只会在我不关心的日期和时间的值上有所不同。 【参考方案1】:
select id, url, xml
from table1
where id in (
    select min(id)
    from table1
    group by url)

会给你删除重复网址的行(并且只包括重复网址的第一个实例)

【讨论】:

这个查询也会给出有重复的 url(但第一个重复)的结果。如果您只想要不重复的网址,请添加到第二个选择:WHERE count(id) = 1 @klew - 是的,你是对的。据我了解,dikla 想要表格中的所有网址,但不想再次列出任何网址。 @klew - 再想一想,如果你只想要没有重复的 url,那么 dikla 应该包含一个 HAVING 子句而不是 WHERE 子句。所以查询需要: Select id, url, xml from table1 where id in (select min(id) from table1 group by url HAVING count(id) = 1)【参考方案2】:

您需要重新阅读您的问题并考虑一下。

您要求提供 URL(可以是重复的),但您不希望重复,并且您还需要 ID(不重复)。样本数据:

1,http://www.google.com
2,http://www.yahoo.com
3,http://www.google.com

在这种情况下,您究竟想返回什么,记住 google 有多个 ID?

XML 也是如此。如果给定 URL 不是唯一的,您需要指定如何为每个 URL 仅获取一个条目,这就是您的查询不起作用的原因。

【讨论】:

【参考方案3】:

您没有对列 XML 执行聚合函数,您必须将其包含在您的分组依据中。

请记住,如果每一行的数据都不同,则实际上无法对其进行分组,并且您将无法获得所需的结果,尽管它们是您向数据库询问的结果 :)。

【讨论】:

【参考方案4】:
select urlMaxId.id, urlMaxId.url, table1.html from (select url, max(id) id from table1 group by url) urlMaxId inner join table1 on urlMaxId.id = table1.id

【讨论】:

以上是关于SQL“分组依据”问题 - 我无法选择每一列的主要内容,如果未能解决你的问题,请参考以下文章

数据库查询选择所有列,包括按“分组依据”的每条记录的计数

Pandas 中的 SQL 选择和分组依据

Amazon athena 无法读取 S3 Access 日志文件,Athena 选择查询为每一列返回空结果集

分组依据的 SQL QUERY 错误

选取 SQL“分组依据”中的任何元素

Spark SQL 中分组依据和窗口函数如何交互?