2011-06-16 94 views
0

考慮具有3列的customerBalance表:名稱,日期和餘額。假設一組類似記錄:約翰子查詢:如何從列中檢索最後一個非零值?

cus_name cus_date cus_balance 
John  06/14/2011 1000 
John  06/15/2011 500 
John  06/16/2011  0 
Mary  06/14/2011 3000 
Mary  06/15/2011 2800 
Mary  06/16/2011  0 

如何創建一個SQL查詢返回,對於日期2011/6/16,而不是0,根據日期的最後一個非零值(以樣品,$ 500和瑪麗2800美元)?

我想使用一個子查詢來使用Max函數來檢索非零值的最後日期,但我沒有成功。這個例子很「無意義」,但我真的需要在我的數據集中做這樣的操作。謝謝!

+0

如果6月17日爲瑪麗,你1000?或者將日期作爲參數?還有什麼Db /版本呢? – gbn 2011-06-16 19:08:46

回答

2

注意:如果您可以指定數據庫和版本,則可以改進此查詢。

試試這個:

SELECT * 
    FROM customers 
WHERE (cus_name, cus_date) 
     IN 
     (
      SELECT cus_name, MAX(cus_date) 
       FROM customers 
      WHERE cus_balance <> 0 
      GROUP BY cus_name 
     ) 

更新:替代版本:

SELECT a.* 
    FROM customers a, 
      (
       SELECT cus_name, MAX(cus_date) 
        FROM customers 
       WHERE cus_balance <> 0 
       GROUP BY cus_name 
      ) b 
WHERE a.cus_name = b.cus_name 
    AND a.cus_date = b.cus_date 
+0

它看起來不錯,但不幸的是我使用的是「古老的」Access 2000,而且語法運行不正常。你有另一種方法嗎? – Alex 2011-06-16 19:31:19

+0

@darth:我添加了一個替代版本的帖子(雖然沒有測試)。請嘗試一下.. – Chandu 2011-06-16 19:36:34

+0

我在詢問之前正在做類似於第二個版本的操作,並且在執行您的代碼時出現了與Access相同的錯誤消息,這應該與英文中的代碼類似:「您做了可以返回的子查詢在主查詢的FROM子句中沒有使用保留字EXISTS的多個字段查看子查詢中的SELECT指令,以便它只需要一個字段「。無聊,但我還無法解決它。 – Alex 2011-06-16 20:09:04

0

這裏有雲:

CREATE Table #temp 
(
    Cus_Name VARCHAR(200) NULL, 
    Cus_Date Char(8) NULL, 
    Cus_Balance INT NULL 
) 

INSERT INTO #temp VALUES ('John' , '20110614' ,1000) 
INSERT INTO #temp VALUES ('John' , '20110615' , 500) 
INSERT INTO #temp VALUES ('John' , '20110616' , 0) 
INSERT INTO #temp VALUES ('Mary' , '20110614' ,3000) 
INSERT INTO #temp VALUES ('Mary' , '20110615' ,2800) 
INSERT INTO #temp VALUES ('Mary' , '20110616' , 0) 

SELECT 
    T.Cus_Name , 
    MIN(t.Cus_Balance) 
FROM #temp t 
WHERE t.Cus_Balance <>0 
GROUP BY t.Cus_Name 

DROP TABLE #temp 
+0

感謝您的回覆,@Raj Jayaswal,但我不能像這樣使用這種方法處理超過一百萬條記錄。問候。 – Alex 2011-06-16 20:11:40

相關問題