我试图找到过去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
个记录。所以每个日期都有许多不同名称的条目。
答案 0 :(得分: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'
对于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()
;
但请注意,它可能返回多个记录,其中低值相同,要在这些记录中选择1行,您已在不同属性上指定了另一个标准
答案 1 :(得分:0)
考虑对其进行分组并运行子句
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);
鉴于结构,上述查询应该可以为您提供结果。
答案 2 :(得分:0)
//试试这段代码..
SELECT MIN(`date`) AS date1,low
FROM historical_data
WHERE `date` BETWEEN now() - interval 1 month
AND now() ORDER by low ASC;