SQL - 查询帮助:查找局部最大值

Posted

技术标签:

【中文标题】SQL - 查询帮助:查找局部最大值【英文标题】:SQL - Query Help: Finding a Local Maximum 【发布时间】:2009-07-23 02:32:03 【问题描述】:

我有一个表格,其中包含来自图表的数据。

例如

index  value
0      3
1      5
2      7
3      6
4      8
5      9
6      12
7      11
8      10
9      14
10     13

我需要一个返回值处于局部最大值的结果的查询,即特定索引处的值大于 index+1 和 index-1 处的值。

所以对于示例集,它应该返回索引列表:2、6、9 对应于值 7、12、14。

我将 php 与 SQLite 一起使用。 我可以用 php 中的 foreach 循环来完成,但想知道是否有一种简单的方法可以只使用 SQL 命令来完成。

我们将不胜感激。

【问题讨论】:

【参考方案1】:

或者使用子查询(这个已经测试过了):

select ind
from tmp1 t1
where val > (select val from jdoyle.tmp1 t2 where t2.ind = t1.ind-1)
and val > (select val from jdoyle.tmp1 t2 where t2.ind = t1.ind+1);

【讨论】:

【参考方案2】:

在 PHP 中使用单个循环执行此操作可能比将其硬塞到 SQL 查询中要快得多,但如果您真的愿意,您可以通过以下方式自行加入表:

SELECT b.index
FROM   points AS a, points AS b, points AS c
WHERE  a.index = b.index-1 AND c.index = b.index+1
   AND a.value < b.value   AND c.value < b.value 

(未经测试,所以*交叉手指*。)

【讨论】:

是的,我尝试了 sql 实现,它们都比我的等效 php 代码慢。谢谢。【参考方案3】:

如果您的 SQL 数据库支持存储过程,您可以在 SQL 中的存储过程中编写循环。但是,我认为 sqlite 没有足够丰富的存储过程来做这样的事情,你需要使用 mysql、postgresql 或类似的。

【讨论】:

【参考方案4】:

好吧,如果您在生产中使用 sqlite,我想您没有大量数据。考虑到这一点,最好的解决方案确实是在 php 级别解决它。

【讨论】:

以上是关于SQL - 查询帮助:查找局部最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个 SQL 查询查找每列的最大值

SQL查询以查找列和行中的最大值

SQL查询以在一组语句中查找最大值[重复]

SQL查询用于查找用户每月的最大金额[重复]

查找内部联接的最大值 - SQL

SQL 查询不同字段的最大值