0

所以,我有一个表,我想从记录中的一个字段中获取值,该字段在另一个字段中具有最大的 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如果我添加到查询中,这将返回每个余额的记录。

是的,我可以发出 aSET ENGINEBEHAVIOR 70但我想知道这是否可以在不必恢复到以前版本的情况下完成?

编辑 我确实让 Frank Perez 查询工作,但只有在将 DateTime 字段转换为 SQL IN 子句的字符之后。请注意使用 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')) ) ;
4

2 回答 2

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' and”,您将获得所有仪表的所有余额...

此外,如果直接从 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
于 2010-05-06T16:46:22.763 回答
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')) ) ;
于 2010-05-07T11:59:03.037 回答