SQL - 找到性能更好的第 n 个最高金额

Posted

技术标签:

【中文标题】SQL - 找到性能更好的第 n 个最高金额【英文标题】:SQL - Find nth Highest Amount with better performance 【发布时间】:2012-07-17 05:21:44 【问题描述】:

我知道,这是一个很老的问题,已经问了好几次了。

当我们有超过 2 亿条记录时,我想编写性能更好的查询,并且应该独立于数据库..

我尝试过以下查询

// mysql QUERY simillar TO rownum of Oracle (DB Supported: MYSQL, ORACLE, POSTGRESS)

SELECT RS.amt
FROM
(SELECT t.amount AS amt, 
       @rownum := @rownum + 1 AS rank
FROM salerecord t, 
       (SELECT @rownum := 0) r
ORDER BY t.amount DESC LIMIT 5) RS
WHERE RS.rank=5

//支持LIMIT的数据库,性能好(支持的数据库:MYSQL,Postgres)

SELECT amount FROM salerecord ORDER BY amount DESC LIMIT 4, 1;

//适用于几乎所有数据库,但性能不佳

SELECT amount FROM salerecord a WHERE 5 = (SELECT COUNT(*) FROM salerecord b WHERE a.amount <= b.amount) ;

【问题讨论】:

如果您正在寻找***性能,您将不得不放弃数据库独立性。 【参考方案1】:

在没有 LIMIT 或 TOP 运算符的情况下,在 SQL 中没有有效的方法来执行此操作。

对于允许增量检索结果的系统,您可以通过获取前五条记录并简单地关闭连接来模拟所需的行为。

使用 LINQ 在 .NET 框架上构建的客户端软件可以使用 Take 运算符。

(以上假设根据您的示例对所需维度进行降序排列。)

【讨论】:

以上是关于SQL - 找到性能更好的第 n 个最高金额的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server 数字金额转中文金额 函数

SQL金额转大写

如何找到包括当前金额在内的一年的先前金额的总和

[编程题] 微信红包

如何在单个 oracle SQL 查询和总金额中针对 person_number 和更多列获取总金额

MySQL数据库存储价格金额用啥数据类型好