我们需要在 Oracle 数据库中对数据进行分组,并且必须得到 aProductNumber
和 a Description
。Description
需要是表中出现次数最多的那个。两者都是一个varchar2
。原始数据见下图:
产品编号 | 描述 |
---|---|
美国广播公司 | 产品ABC(有折扣) |
美国广播公司 | 产品ABC |
美国广播公司 | 产品ABC |
国防军 | 产品定义 |
预期结果:
产品编号 | 描述 |
---|---|
美国广播公司 | 产品ABC |
国防军 | 产品定义 |
我们已经尝试过了,但没有找到一种方法来包含出现Description
次数最多的 。
select distinct cnt1.ProductNumber
from (select COUNT(*) as total, ProductNumber
from Inventory
group by ProductNumber) cnt1,
(select MAX(total) as maxtotal, ProductNumber
from (select COUNT(*) as total, ProductNumber
from Inventory
group by ProductNumber)
group by ProductNumber) cnt2
where cnt1.total = cnt2.maxtotal;
在这里你可以找到一个 fiddle。
你知道我们该怎么做吗?
这是使用窗口函数的一种方法:
编辑:添加了一组稍大的数据的计划,小提琴
Verace 查询
H. Pauwelyn 修改后的查询
Lennart 的询问
我看了这个 - 这是一个有趣的问题(+1)。
我还添加了示例数据 - 总是很难涵盖边缘情况,但值得一看(数据和整个分析在这里小提琴)。
所以,我们有:
结果:
我制定了以下 SQL(我已经展示了导致我回答的早期步骤 - 部分是为了您的理解,部分是为了我自己的理解!:-)):
结果:
现在,请注意我的 SQL 选择了在两个(有和没有折扣)记录
RST, Product RST without discount
之间进行选择的记录。RST
现在,您将从小提琴中看到 Lennart 的查询返回另一条
RST
记录。您可能希望对此进行调查并确保您检索到在所有情况下都需要的记录。
我还查看了查询计划。我从 Franck Pachot 的一篇文章中的小提琴和相关的 Oracle 小提琴在这里找到了如何使用小提琴来做到这一点。
现在,我远不是 Oracle 计划方面的专家,但鉴于它们的相似性,我无法判断 Lennart 的查询还是我自己的查询在给定大型数据集的情况下效率更高。我会敦促您使用真实的数据集进行测试。
从我的查询中获得的唯一“具体”好处是它可以在不支持的旧版本服务器上使用
ROW_NUMBER()
- 但即使是 MySQL 现在也有这些,因此不太可能获得显着收益!:-)ps 你会注意到我已经稍微修改了你的查询以使用 ANSI 连接,如下所示:
我希望你觉得这很有帮助和/或更具可读性?我认为你的执行一个
CROSS JOIN
然后过滤器,这可能对大型数据集有问题?