0

したがって、テーブルがあり、レコード内の1つのフィールドから、別のフィールドで最大の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ドライバーでは、SELECTにリストされている非集計フィールドをそれぞれリストするGROUPBYが必要であるというVFP8に準拠する必要があります。GROUP BY a.balanceこれにより、クエリに追加した場合、各残高のレコードが返されます。

はい、発行SET ENGINEBEHAVIOR 70できますが、以前のバージョンに戻さなくてもこれを実行できるかどうかを知りたいですか?

編集 私はFrankPerezクエリを機能させましたが、SQLIN句のDateTimeフィールドを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')) ) ;
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 にインデックスがない場合、このクエリは遅くなります。ただし、特定の 1 つのメーターの残高のみを取得しようとしている場合は、次のクエリは同じ結果を返し、より高速になります。

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 に答える