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-25
到 2017-12-19
在这个演员阵容中,低值是9.67
,但我当前的查询和我的某个成员建议的查询没有带来正确的答案。
更新 2:
http://rextester.com/TDBSV28042
在这里,基本上我有更多 1400
coins
和 token
历史数据,这意味着我将有超过 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中数据库的最小值的主要内容,如果未能解决你的问题,请参考以下文章