如何在VFP v8.0中根据另一个字段的最大值获取字段值

时间:2010-05-06 16:28:48

标签: sql foxpro visual-foxpro

所以,我有一个表,我希望从另一个字段中具有最大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')) ) ;

2 个答案:

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