根据 mySQL 中的有效起始日期查找具有今天有效价格的行
Find the row with today's valid price depending on a validFrom date in mySQL
来了。我有以下数据:
type, validfrom, price
1, 2018-01-15, 10
1, 2018-01-20, 20
1, 2018-01-25, 30
2, 2018-01-01, 12
3, 2018-01-01, 18
今天是 2018-01-21,我需要一个生成以下结果的查询:
1, 2018-01-20, 20
2, 2018-01-01, 12
3, 2018-01-01, 18
我尝试了使用子选择和分组依据的不同组合,但我没能找到一个很好的、简短的查询来解决这个问题(这也很有效)。
有什么想法吗?
在MySQL中,您可以:
select t.*
from t
where t.validfrom = (select max(t2.validfrom)
from t t2
where t2.type = t.type and
t2.validfrom < now()
);
有了 t(type, validfrom)
上的索引,这应该有很好的性能。
http://sqlfiddle.com/#!9/47c9e5/8
SELECT p.*
FROM prices p
LEFT JOIN prices p_
ON p.type = p_.type
AND p.validfrom < p_.validfrom
AND p_.validfrom< NOW()
WHERE p_.type IS NULL
AND p.validfrom<=NOW()
来了。我有以下数据:
type, validfrom, price
1, 2018-01-15, 10
1, 2018-01-20, 20
1, 2018-01-25, 30
2, 2018-01-01, 12
3, 2018-01-01, 18
今天是 2018-01-21,我需要一个生成以下结果的查询:
1, 2018-01-20, 20
2, 2018-01-01, 12
3, 2018-01-01, 18
我尝试了使用子选择和分组依据的不同组合,但我没能找到一个很好的、简短的查询来解决这个问题(这也很有效)。
有什么想法吗?
在MySQL中,您可以:
select t.*
from t
where t.validfrom = (select max(t2.validfrom)
from t t2
where t2.type = t.type and
t2.validfrom < now()
);
有了 t(type, validfrom)
上的索引,这应该有很好的性能。
http://sqlfiddle.com/#!9/47c9e5/8
SELECT p.*
FROM prices p
LEFT JOIN prices p_
ON p.type = p_.type
AND p.validfrom < p_.validfrom
AND p_.validfrom< NOW()
WHERE p_.type IS NULL
AND p.validfrom<=NOW()