所以,我有一个表,我希望从另一个字段中具有最大DateTime()值的记录中的一个字段获取值,并且还有另一个字段等于某个值。
示例数据:
Balance Created MeterNumber
7924.252 02/02/2010 10:31:48 AM 2743800
7924.243 02/02/2010 11:01:37 AM 2743876
7924.227 02/02/2010 03:55:50 PM 2743876
我希望获得具有特定仪表编号的最大创建日期时间的记录的余额。在VFP 7中,我可以使用:
SELECT a.balance ,MAX(a.created) FROM MyTable a WHERE a.meternumber = '2743876'
但是,在我的ASP.NET页面中使用的VFP v8.0 OleDb驱动程序中,我必须符合VFP 8,它说你必须有一个GROUP BY列出SELECT中列出的每个非聚合字段。如果我将GROUP BY a.balance
添加到查询中,这将返回每个余额的记录。
是的,我可以发出SET ENGINEBEHAVIOR 70
,但我想知道是否可以在不必恢复到以前版本的情况下完成此操作?
修改 我确实让Frank Perez查询工作,但只有在将DateTime字段转换为SQL IN子句的Character之后。请注意使用TTOC()函数包装DateTime字段。
SELECT ;
MyTable.created, ;
MyTable.balance ;
FROM ;
MyTable ;
WHERE ;
( MyTable.meternumber = '2743876' ) ;
AND ( TTOC(MyTable.created) IN (SELECT TTOC(MAX(created)) FROM MyTable WHERE (meternumber = '2743876')) ) ;
答案 0 :(得分:0)
select
YT.Balance,
YT.Created
from
YourTable YT
where
YT.MeterNumber = '2743876'
and YT.Created in
( select
max( YT2.Created ) Created
from
YourTable YT2
where
YT.MeterNumber = YT2.MeterNumber
)
从where子句中删除第一个“YT.MeterNumber ='2743876'和”,你将得到所有米的所有余额......
此外,如果直接从VFP运行测试,只需添加“;”每行末尾的行延续。对于VFP6,7,8或9应该是没有问题的。
根据您的其他评论,如果始终基于SINGLE MeterNumber调用此查询,则可以调整为
select
YT.Balance,
YT.Created
from
YourTable YT,
( select YT2.MeterNumber,
max( YT2.Created ) Created
from
YourTable YT2
where
YT2.MeterNumber = '2743876'
group by
1 ) YT3
where
YT.MeterNumber = '2743876'
and YT.MeterNumber = YT3.MeterNumber
and YT.Created = YT3.Created
答案 1 :(得分:0)
DRapp是正确的,如果MeterNumber上没有索引,则此查询将很慢。但是,如果您只是尝试获取一个特定仪表的余额,则以下查询将返回相同的结果并且应该更快。
SELECT ;
MyTable.created, ;
MyTable.balance ;
FROM ;
MyTable ;
WHERE ;
( MyTable.meternumber = '2743876' ) ;
AND ( MyTable.created IN (SELECT MAX(created) FROM MyTable WHERE (meternumber = '2743876')) ) ;