2010-05-06 95 views
0

因此,我有一個表,我想從另一個字段中的DateTime()值最大的記錄中的一個字段獲取值還有一個領域等於一定的價值。如何獲得基於VFP v8.0中另一個字段的最大值的字段值

示例數據:

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' 

但是,在VFP 8.0 OLEDB驅動程序,我用我的ASP.NET頁面我必須符合VFP 8,說,你必須有一個GROUP BY列出每個非在SELECT中列出的聚合字段。如果我將GROUP BY a.balance添加到我的查詢中,這將返回每個餘額的記錄。

是的,我可以發出一個SET ENGINEBEHAVIOR 70,但我想知道這是否可以不必恢復到以前的版本?

編輯 我沒有得到弗蘭克佩雷斯查詢工作,但只是將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'))) ; 
+0

所以,你是從VFP外部做這個,比如.Net或其他OleDB連接,以便符合SQL? – DRapp 2010-05-06 16:42:01

+0

是的,使用.NET中的OleDb類。我發送的所有SQL命令仍然必須通過驅動程序與VFP兼容。 – DaveB 2010-05-06 17:54:42

回答

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 
      ) 

刪除第一個 「YT.MeterNumber = '2743876' 和」 從where子句,你會得到所有的餘額都米...

此外,如果從VFP運行直接測試,只需添加「;」在每行的結尾連續行。應該complient與VFP6,7,8沒有問題,或9

根據您的其他意見,如果該查詢總是要基於單一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 
+0

我在我的264,966條記錄表上嘗試了VFP 7中的查詢。用可聽磁盤驅動器活動執行5分鐘後,出現「文件映射不足的內存」錯誤。 – DaveB 2010-05-06 22:03:46

+0

您的表中有多少條記錄是2743876的單個ID密鑰..如果在VFP中,MeterNumber上是否存在INDEX TAG以利用它? – DRapp 2010-05-07 01:41:42

+0

MeterNumber ='2743876'有5499條記錄,並且存在ASC的索引,並且在計數器編號字段中設置了排序,以避免空值。 – DaveB 2010-05-07 15:11:13

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'))) ; 
+0

正確應用MeterNumber到查詢的兩個部分。但是,如果Dave正在尋找每個人的餘額,它應該仍然很靈活 – DRapp 2010-05-07 14:26:53

+0

我從VFP 7測試了這個查詢。運行速度很快,但沒有返回任何記錄。看起來在子查詢中找不到創建的日期時間字段,即使記錄存在匹配的日期時間值。在發佈這個問題之前,我有與我的查詢相同的問題,並認爲我必須錯過一些東西。 – DaveB 2010-05-07 15:46:33

+0

我確實讓你的查詢能夠稍作修改。請參閱編輯我的問題。任何想法或評論任何人? – DaveB 2010-05-07 15:56:34

相關問題