Mysql 从表中选择最后一个低值

Mysql 从表中选择最后一个低值,mysql,gaps-and-islands,Mysql,Gaps And Islands,我有一张这样的桌子: id | value | datestamp ----------------------- 1 | 89 | 2015-05-25 16:49:25 2 | 60 | 2015-05-26 16:49:25 3 | 42 | 2015-05-27 16:49:25 4 | 12 | 2015-05-28 16:49:25 5 | 3 | 2015-05-29 16:49:25 6 | 95 | 2015-05-30 16:

我有一张这样的桌子:

id | value | datestamp
-----------------------
1  | 89    | 2015-05-25 16:49:25
2  | 60    | 2015-05-26 16:49:25
3  | 42    | 2015-05-27 16:49:25
4  | 12    | 2015-05-28 16:49:25
5  | 3     | 2015-05-29 16:49:25
6  | 95    | 2015-05-30 16:49:25
7  | 75    | 2015-06-01 16:49:25
8  | 52    | 2015-06-02 16:49:25
9  | 31    | 2015-06-03 16:49:25
10 | 12    | 2015-06-04 16:49:25
11 | 99    | 2015-06-05 16:49:25
...
这些值是百分比,介于100和0之间,除了每个周期一次外,总是在减少,但几乎从来没有精确到0或100,只是大约。 是否有一个简单的select查询来获取具有最新低值的行?在本例中,10 ID。 提前感谢您的帮助

更新


正如Tim Biegeleisen所说,这是一个缺口和岛屿问题。我想要表中的最后一行,该行的前后值都较大,但最后一行除外。

要获取最新值,请按日期排序,然后按值排序

Select top(1) * from table order by datestamp desc, value

按id描述从表顺序中选择id、名称限制1它应该适用于您:

SELECT TOP 1
    id
    , value
    , datestemp 
FROM yourtable yt1
INNER JOIN 
(
    SELECT 
        MIN(yt2.value) minval
        , MONTH(yt2.datestamp) datemonth 
    FROM yourtable yt2
    GROUP BY MONTH(yt2.datestamp)
) yt3 ON yt3.minval = yt1.value AND yt3.datemonth = MONTH(yt1.datestamp)
ORDER BY yt1.datestamp DESC
不知道我的Sql是否支持TOP子句。若一个月内有一个最小值,那个么你们就不需要top子句了。该查询基于这样一个事实,即您选择的最小值是最近一个月的值

更新: 我想你想要的是:

SELECT * FROM 
(
    SELECT * FROM yourtable ORDER BY datestamp DESC LIMIT 2
) S 
ORDER BY value LIMIT 1
你可以试试这个

select * form tbl_name order by id desc limit 1

虽然这对于人来说是一项简单的任务,但很难用SQL来表达

值为百分比,介于100和0之间,除每个周期一次外,始终减小

我通过自连接解决了这个问题,它应该提供最好的性能。但是,您应该在日期戳上创建(如果尚未创建)索引

SELECT a.*
FROM tbl1 a
INNER JOIN tbl1 b ON b.datestamp > a.datestamp
WHERE b.value > a.value
GROUP BY a.id
ORDER BY a.datestamp DESC, b.datestamp DESC
LIMIT 1
更新

我想要表格中的最后一行,其中前后的值都较大

如果你想确定你能做到这一点

SELECT a.*
FROM tbl1 a
INNER JOIN tbl1 b ON b.datestamp > a.datestamp
INNER JOIN tbl1 c ON c.datestamp < a.datestamp
WHERE b.value > a.value
AND c.value > a.value
GROUP BY a.id
ORDER BY a.datestamp DESC, b.datestamp DESC
LIMIT 1
选择一个*
来自tbl1 a
内部连接tbl1 b在b.日期戳>a.日期戳上
内部连接tbl1 c在c.datestampa.value
c.value>a.value
按a.id分组
按a.邮戳说明订购,b.邮戳说明订购
限制1

但是我不认为这是必要的。

你怎么说ID为10的行具有最新的低值?我的意思是在值字段中有最小值,在本例中:3和12每个都有日期,我需要最新的最小值,在这种情况下,12我看到的一个方法是一个月内的最小值,因为3在不同的月份,12在不同的月份。如果是这种情况,他们会尝试我在答案中发布的查询。我给出了答案,但随后将其删除,因为我认为这确实是一个缺口和孤岛问题。@TimBiegeleisen你是对的,我以前不知道“缺口和孤岛”这一术语,但没错,我想要表中最后一个值,其中前后的值都较大,除了在最后一行的情况下,它只是给我最后一行,但我需要在字段中具有最新最小值的那一行,按日期排序您希望在上面的示例中得到什么结果?也许我可以提供一个给定的表格示例,我想要ID=10的行,因为值=12是最后一个最小值。。这是太笼统的“最后一个低值”。它的最后一个,但它取决于日期吗?有基础吗?请编辑更多信息。不鼓励只编写代码和“尝试这个”答案,因为它们不包含可搜索的内容,也不解释为什么有人应该“尝试这个”。我认为这是一个差距和孤岛问题。我真的不知道差距和孤岛问题。看完你的评论后,点击谷歌。我需要花时间阅读和理解全部内容。谢谢你向我介绍这个问题。问题中的“孤岛”是由前后两个较大的值包围的值。@TimBiegeleisen我想你说得对,它的间隙和孤岛我只是在阅读,它说这需要逐行处理,而不是基于集合的处理。这是否意味着Henrietta需要逐行处理记录并确定他想要选择的行?