【问题标题】:Oracle ORDER BY with rownum or HAVING >= ALLOracle ORDER BY with rownum 或 HAVING >= ALL
【发布时间】:2013-04-28 15:28:15
【问题描述】:

我的数据库老师让我(在 Oracle 服务器上)编写一个查询:选择 2010 年平均得分最高的 groupid

我写道:

SELECT * FROM (
    SELECT groupid, AVG(score) average FROM points
    WHERE yr = 2010
    AND score IS NOT NULL
    GROUP BY groupid
    ORDER BY average DESC
) WHERE rownum = 1;

我的老师告诉我这个要求“更好”:

SELECT groupid, AVG(score) average FROM points
WHERE yr = 2010
GROUP BY groupid
HAVING AVG(score) >= ALL (
    SELECT AVG(score) FROM points
    WHERE yr = 2010
    GROUP BY groupid
);

哪个是最快/更好的?还有更好的解决方案吗(仅适用于 Oracle)? 谢谢。

【问题讨论】:

    标签: sql select average having rownum


    【解决方案1】:

    你的导师告诉你有两个原因。

    1. 数据模型。关系 DBMS 处理集合,而不是列表。如果您正在学习 SQL,那么您最好考虑无序的元组集合,而不是顺序列表。您将更好地了解如何查询 DBMS。我认为您的解决方案是一种 hack:一个部分有效的解决方案,因为 - 正如 Perun_x 指出的那样 - 如果多个元组匹配结果,它就不起作用。有悖于SQL的数据模型和精神)。

    2. 便携性。这才是真正的杀手。您的代码可以在 Oracle 上运行,但不能在不支持 row_number 属性的其他 DBMS 上运行(每个都有自己的方法)。

    --dmg

    【讨论】:

    • 谢谢。事实上,我没有“元组集”的观点。但是表演方式旁边的教育方式不适合我,真的很有趣。就便携性而言,这是完全正确的。我更喜欢在 rownum 内使用 LIMIT,我知道这也不是可移植的。另一方面,我们也在学习 Oracle 特定的代码……
    【解决方案2】:

    查询不等价。第一个查询总是选择 1 行。第二个选择平均值最高的所有行(理论上可以有更多这样的行)。

    【讨论】:

    • 确实如此。在我们的例子中,这不应该发生。
    【解决方案3】:

    我碰巧更喜欢您的版本,假设一行足以满足您的需要。我对老师版本的问题主要是可读性。我觉得很难解析。

    您的版本本质上是说“按平均数对各组进行排序,然后取平均数最高的一组。”教师版本质上是说:“找到大于或等于任何组平均值的平均值”。这可能是主观的,但我发现前者比后者更容易理解。

    至于哪个更快。您需要进行聚合和排序以获得最佳价值。第二个版本需要做两个聚合和一个连接。我认为聚合/排序方法会更快,但真正知道的唯一方法是检查特定系统配置和数据集的性能。

    在性能方面应该与您的大致相当的替代公式是:

    select groupid, avgscore
    from (select groupid, avg(score) as avgscore,
                 row_number() over (order by avg(score) desc) as seqnum
         from points
         where yr = 2010
         group by groupid
        ) t
    where seqnum = 1
    

    这里的优点是您可以将row_number() 更改为dense_rank() 以获得最佳行之一或所有最佳行。

    【讨论】:

    • 谢谢。我尝试了一些方法(也尝试了 WITH 语句),是的,HAVING 方法要慢得多。你的替代方案很有趣。
    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2013-10-11
    相关资源
    最近更新 更多