我有一个使用last()的MS Access查询,但有时它不能按预期工作 - 我知道这是预期的lol。但我需要在Access中找到解决方案,或者将以下查询转换为MySQL。有什么建议吗?
SELECT maindata.TrendShort, Last(maindata.Resistance) AS LastOfResistance, Last(maindata.Support) AS LastOfSupport, Count(maindata.ID) AS Days, Max(maindata.Datestamp) AS Datestamp, maindata.ProductID
FROM market_opinion AS maindata
WHERE (((Exists (select * from market_opinion action_count where maindata.ProductID = action_count.ProductID and maindata.Datestamp < action_count.Datestamp and maindata.TrendShort<> action_count.TrendShort))=False))
GROUP BY maindata.TrendShort, maindata.ProductID
ORDER BY Count(maindata.ID) DESC;
只有LastOfResistence和LastOfSupport偶尔出错,其他字段总是正确的。
CREATE TABLE `market_opinion` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`ProductID` int(11) DEFAULT NULL,
`Trend` varchar(11) DEFAULT NULL,
`TrendShort` varchar(7) DEFAULT NULL,
`Resistance` decimal(9,2) unsigned DEFAULT NULL,
`Support` decimal(9,2) unsigned DEFAULT NULL,
`Username` varchar(12) DEFAULT NULL,
`Datestamp` date DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `ProductID` (`ProductID`),
KEY `Datestamp` (`Datestamp`),
KEY `TrendShort` (`TrendShort`)
) ENGINE=InnoDB AUTO_INCREMENT=9536 DEFAULT CHARSET=utf8;
答案 0 :(得分:0)
如果没有对数据的感觉,这就变成了猜测,但我想的是Last(Resistance)和Last(Support)不一定与Max(DateStamp)的记录相同。您可以尝试将查询分解为2部分查询,例如:
Select maindata.TrendShort, Resistance, Support, COUNT(ID) as Days, ProductId
FROM market_opinion maindata
INNER JOIN (SELECT mo.TrendShort, MAX(mo.DateStamp) AS MaxDate
FROM market_opinion mo
WHERE (((EXISTS(SELECT ...))=FALSE))
GROUP BY mo.TrendShort) inner
WHERE maindata.TrendShort=inner.TrendSort AND maindata.DateStamp = inner.MaxDate
ORDER BY Days DESC;
我遗漏了你的查询的大部分省略号(...),我不希望有任何变化。您可以考虑查看http://www.access-programmers.co.uk/forums/showthread.php?t=42291关于第一个/最后一个与最小/最大值的讨论。如果这让你更接近,请告诉我。如果没有,也许一些样本数据无法解决。它可能会对正在发生的事情有所了解。
答案 1 :(得分:0)
call
或First
只返回某些(任意)记录,这些记录不是最后一个或第一个。
在大多数情况下,只需使用Last
作为第一个,Min
作为最后一个。