子查询:如何从列中检索最后一个非零值?

时间:2011-06-16 18:58:30

标签: sql

考虑具有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查询,对于日期为6/16/2011而不是0,返回基于日期的最后一个非零值(在示例中,John为500美元,Mary为$ 2800)?

我正在尝试使用子查询来执行此操作,该子查询使用Max函数来检索具有非零值的最后日期,但我没有成功。这个例子非常“荒谬”,但我真的需要在我的数据集中进行这样的操作。谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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