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 - 查询帮助:查找局部最大值的主要内容,如果未能解决你的问题,请参考以下文章