MySQL中数据库的最小值

时间:2017-12-25 14:14:04

标签: php mysql greatest-n-per-group

我试图找到过去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

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

更新

这是我更新的表格结构。 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个记录。所以每个日期都有许多不同名称的条目。

3 个答案:

答案 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'

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行,您已在不同属性上指定了另一个标准

答案 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;