MS Access last()结果有时是错误的

时间:2015-08-10 18:50:18

标签: sql ms-access

我有一个使用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;

2 个答案:

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

callFirst只返回某些(任意)记录,这些记录不是最后一个或第一个。

在大多数情况下,只需使用Last作为第一个,Min作为最后一个。