SQL语句HAVING MAX(部分+事)=有些+事情
我在用Microsoft Access 2003,它在抱怨这种说法麻烦:SQL语句HAVING MAX(部分+事)=有些+事情
select cardnr
from change
where year(date)<2009
group by cardnr
having max(time+date) = (time+date) and cardto='VIP'
我想要做的是,对于每一个不同的cardnr在表中更改,找到2009年以前的最新(时间+日期)行,然后选择cardto ='VIP'的行。
这个validator说没关系,Access说它不好。 “您试图执行不包含指定表达式'max(time + date)= time + date和cardto ='VIP'和cardnr ='的查询作为集合函数“。
难道有人请解释我做错了什么和正确的方式来做到这一点?谢谢
注意:字段和表名被翻译,不与任何保留字冲突,我没有任何名称的麻烦。
试着像这样想 - 在聚合完成后应用HAVING。 因此,它无法与未聚合的表达式(时间+日期和cardto)进行比较。
但是,要获得最后的(原则是获得与其他聚合函数作为WEEL行相同)的时间和日期,你可以这样做:
SELECT cardnr
FROM change main
WHERE time+date IN (SELECT MAX(time+date)
FROM change sub
WHERE sub.cardnr = main.cardnr AND
year(date)<2009
AND cardto='VIP')
(假设你的时间日期部分字段对于所有记录是相同的;具有两个日期/时间字段不符合您的最佳利益,并且在某些情况下使用字段名称的保留字可能会适得其反)
它可以工作,因为子查询仅在您从外部查询中感兴趣的记录。
将同一年份(日期)< 200和cardto ='VIP'应用于外部查询可以进一步提高性能。
谢谢你的回答。我试图理解什么时候聚合函数被实际执行,它感觉它是在分组发生的同时完成的,即使函数是在HAVING子句中写入的(我已经把它写入了,我已经“丢失“行和列)。 如果我尝试你的查询,是不是只选择那些有cardto ='VIP'的最新一行? (如果是这样的话,我意识到这只是将cardto =移到外部查询以使其满足我需要的问题。) – Andreas 2010-04-19 22:04:44
至于cardto ='VIP',如果您只想选择具有MAX(时间+日期)的行)并且同时是cardto ='VIP',是将其移出。至于什么时候出现MAX,MIN和其他什么情况 - 是的,你可以说HAVING和GROUP BY同时发生,重要的部分是这样一个事实,即虽然数据库是“通过记录”(当WHERE部分是评估),你还不知道特定记录的MAX。 – Unreason 2010-04-19 22:32:31
这清理了很多东西,再次感谢 – Andreas 2010-04-21 14:16:02
如果您将选择更改为'select cardnr,time,date,cardto ...',该怎么办? – FrustratedWithFormsDesigner 2010-04-19 20:29:58
不应该在where子句中包含所有的东西吗? – 2010-04-19 20:34:22
这又是一个每组最大的问题!见http://stackoverflow.com/questions/755918/simple-query-to-grab-max-value-for-each-id等。 – bobince 2010-04-19 20:49:01