MySQL中数据库的最小值

Posted

技术标签:

【中文标题】MySQL中数据库的最小值【英文标题】:Min value from Database in MySQL 【发布时间】:2018-06-06 18:05:38 【问题描述】:

我正在尝试查找过去 30 天的最小值,在我的表中每天都有一个条目,正在使用此查询

SELECT MIN(low), date, low 
FROM historical_data 
WHERE name = 'bitcoin' 
ORDER BY STR_TO_DATE(date,'%d-%m-%Y') DESC 
LIMIT 7

但是这个值没有返回正确的值。我的表结构是

表结构

存储的表数据是这样的

表格数据样式

现在我需要的是获得最小的低值。但是我的查询不起作用它给了我错误的值,甚至在表中也不存在。

更新:

这是我更新的表结构。 enter image description here

这是我在这张表中的数据,看起来像这样 enter image description here

现在,如果您查看数据,我想检查令牌 omisego 的名称并获取过去 7 天的最低值,即从 2017-12-252017-12-19 在这个演员阵容中,低值是9.67,但我当前的查询和我的某个成员建议的查询没有带来正确的答案。

更新 2:

http://rextester.com/TDBSV28042

在这里,基本上我有更多 1400 coinstoken 历史数据,这意味着我将有超过 1400 个相同日期的条目,如 2017-12-25 但名称不同,我总共有超过650000 记录。所以每个日期都有许多不同名称的条目。

【问题讨论】:

你的帖子看起来是你之前的问题***.com/questions/47966447/…的转贴 @FunkFortyNiner 不是它们完全不同,在前面的问题中,我计算的波动率是不同的,这里的值越来越低,方向完全不同。你怎么说他们是一样的,我很震惊 @FunkFortyNiner 检查用于计算波动率的公式。 请添加您预期的结果集,此外,您使用了聚合函数 min() 没有 group by 子句,这将返回单行,将所有记录视为一个组,因此限制 7 是不使用请用您想要的确切值/数据更新您的问题 VARCHAR 中的日期 ??不是个好主意 【参考方案1】:

要获得每组的最低行,您可以使用以下方法

SELECT a.*
FROM historical_data a 
LEFT JOIN historical_data b ON a.name = b.name 
AND a.low > b.low
WHERE b.name IS NULL
AND DATE(a.date) >= '2017-12-19' AND DATE(a.date) <= '2017-12-25' 
AND a.name = 'omisego'

SELECT a.*
FROM historical_data a 
JOIN (
    SELECT name,MIN(low) low
    FROM historical_data
    GROUP BY name
) b USING(name,low)
WHERE  DATE(a.date) >= '2017-12-19' AND DATE(a.date) <= '2017-12-25' 
AND a.name = 'omisego'

DEMO

对于 7 天或 n 天的最后 30 天,您可以将上述查询写为

SELECT a.*, DATE(a.`date`)
FROM historical_data2 a 
LEFT JOIN historical_data2 b ON a.name = b.name 
AND DATE(b.`date`) >= CURRENT_DATE() - INTERVAL 30 DAY 
AND DATE(b.`date`) <= CURRENT_DATE()
AND a.low > b.low
WHERE b.name IS NULL
AND a.name = 'omisego'
AND DATE(a.`date`) >= CURRENT_DATE() - INTERVAL 30 DAY
AND DATE(a.`date`) <= CURRENT_DATE()
;

DEMO

但请注意,它可能会返回多个低值相同的记录,要从中选择 1 行,您必须在不同属性上指定另一个条件

【讨论】:

@M Khalid Junaid 我找到了一个完整的循环。因为我有多个相同日期但名称不同的条目,所以它没有显示任何结果。 @SaraTariq 你可以在这里添加示例数据rextester.com 并在你的问题中添加你的预期数据吗,从上面的评论中不清楚确切的问题是什么 @SaraTariq 我删除了数据过滤器看看rextester.com/BHAPH90206 这对你有用吗? @M Khalid Junaid,我也需要那个过滤器。这样我就可以检查过去 7 天、30 天或我选择的每个范围内的最低值。 @SaraTariq 查看更新答案和另一个问题,对于超过 1 行的相同低值应该返回哪一行【参考方案2】:

// 试试这个代码..

SELECT MIN(`date`) AS date1,low
        FROM historical_data
 WHERE `date` BETWEEN now() - interval 1 month 
                  AND now() ORDER by low ASC;

【讨论】:

谢谢。它向我显示了具有最低值的正确日期,但该值不正确,它选择了错误的值。表示值与显示的日期不匹配 请更改查询中的数据格式 .. 日期不比较,因为您的日期格式已更改 .... now() 函数是获取默认日期结构 ... 我已经改变了格式,你可以在更新部分查看,现在日期格式是日期时间 我已经完成了,检查我的更新问题,我上传了新图片。【参考方案3】:

考虑将相同的内容分组并运行子句

SELECT name, date, MIN(low)
FROM historical_data 
GROUP BY name
HAVING name = 'bitcoin' 
AND STR_TO_DATE(date, '%M %d,%Y') > DATE_SUB(NOW(), INTERVAL 30 DAY);

鉴于结构,上面的查询应该可以得到你的结果。

【讨论】:

它获得了较低的价值,但不是从过去 30 天开始。它给出了整体低价值 这没有返回任何东西。 问题!日期是一个 VARCHAR 正确@RiggsFolly。日期字段的数据应为“日期时间”类型以避免额外开销。 @SaraTariq 更新后的查询对您有用吗?它会根据过去 30 天的记录为您​​提供结果。

以上是关于MySQL中数据库的最小值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中选择字段具有最小值的数据?

MYSQL如何选择字段具有最小值的数据

在mysql中使用group by选择最小值

MySQL - 选择列表的平均值但忽略最大值和最小值

MySQL:在同一行中的某些条件下选择值和最小值

MySQL max 和 MIN 函数显示 100 及以上作为最小值