MySQL 匹配基于日期的第一个实例值

Posted

技术标签:

【中文标题】MySQL 匹配基于日期的第一个实例值【英文标题】:MySQL Matching date-based First Instance of value 【发布时间】:2019-12-15 17:02:57 【问题描述】:

我有一个包含股票市场数据(开盘价、高价、低价、收盘价)的表格,但日期的顺序是随机的:

Date    Open    Hi  Lo  Close
12/10/2019  313.82  314.54  312.81  313.58
11/22/2019  311.09  311.24  309.85  310.96
11/25/2019  311.98  313.37  311.98  313.37
11/26/2019  313.41  314.28  313.06  314.08
11/27/2019  314.61  315.48  314.37  315.48
11/29/2019  314.86  315.13  314.06  314.31
12/2/2019   314.59  314.66  311.17  311.64
12/3/2019   308.65  309.64  307.13  309.55

我在 php 变量中有另一个值(比如 $BaseValue),以及开始日期和结束日期($startdt 和 $enddt)。

1) 我的要求是从 HI 列中提取值,如果它在给定的开始日期和结束日期之间按时间顺序在第一个日期超过 $BaseValue。

例如,如果 $BaseValue=314,startdt=11/22,enddt=12/2,那么我想检索 Date (11/26/19),因为它是 Hi 值的最早日期(314.28) 超出了给定日期范围内的 $Basevalue。选择语句应返回 Hi 值 (314.28) 和日期 (11/26/19)。

2) 此外,我还需要在给定的日期持续时间内从 HI 列中检索 HIGHEST 值和日期。在上述情况下,它应该返回 315.48 和对应的日期 11/27。

表格不是按时间顺序排列的 - 它是随机填充的。

使用 MAX 函数及其各种组合,我根本无法获得第一个查询。让我想知道这在 SQL 中是否可行。

虽然第二个很简单,但我想知道将两个查询组合在一起并一次获得四个值是否更有效且更简单。

请问有什么想法可以满足这个要求吗?

谢谢

【问题讨论】:

使用日期数据类型存储日期 @Strawberry,它确实是“日期”数据类型(2019-11-29 格式)...在上面的问题中,我在 excel 中提取数据并从 excel 中复制粘贴。 【参考方案1】:

您可以使用两个子查询进行过滤,每个条件一个,例如:

select t.*
from mytable t
where 
    t.date = (
        select min(t1.date)
        from mytable t1 
        where t1.date between :datedt and :enddt and t1.hi >= :basevalue
    )
    or t.hi = (
        select max(t1.hi)
        from mytable t1
        where t1.date between datedt and :enddt and t1.hi >= :basevalue
    )

另一种选择是union 使用orer bylimit 进行两个查询:

(
    select t.* 
    from mytable
    where t.date between :datedt and :enddt and t1.hi >= :basevalue
    order by t.date
    limit 1
)
union
    (
    select t.* 
    from mytable t
    where t.date between :datedt and :enddt and t1.hi >= :basevalue
    order by t.hi desc, t.date
    limit 1
)

请注意,这两个查询并不完全做同样的事情。如果在该期间有最高 hi 的平局,则第一个查询将返回所有平局,而第二个查询将选择最早的一个。由您决定哪种解决方案更适合您的用例。

【讨论】:

以上是关于MySQL 匹配基于日期的第一个实例值的主要内容,如果未能解决你的问题,请参考以下文章

Mysql - 转换非空值第 2 部分

DS串应用--KMP算法

查找匹配查询的第一个和最后一个文档?

查找匹配查询的第一个和最后一个文档?

Retrive在一个价格范围从PHP阵列匹配到特定日期数据

如何获得每天包含多个列的事件的第一个实例,包括日期时间并返回这些列加上完整的日期时间值?