2010-12-15 75 views
0

我想建立客户名单以及他们的AR历史是降神最后一次是0。这里是一个例子一组中选择的所有行至第一个0

我想打开这

ID  ClientID Total Balance 
67202 122   63.01 63.01 
66234 122   60.94 60.94 
65738 122   278.47 0 
62144 122   69.61 69.61 
61662 122   13.65 13.65 
61625 122   169.79 0 
67618 49   47.37 47.37 
62112 49   44.02 0 

这个

ID  ClientID Total Balance 
67202 122   63.01 63.01 
66234 122   60.94 60.94 
67618 49   47.37 47.37 

注意,因为当时他们与排名前两位的记录之间的0,其中不包括记录62144和61662。

删除像62144和61662这样的记录是我的挂机。如果我只是想删除0的我可以做一个Balance <> 0但我只想上记录到第一个0

下面是该查询我至今让我现在的我

select * from [Artrxs] 
where [clientid] in (
    SELECT [ClientID] 
    FROM [Artrxs] 
    where [id] in (
     select max([id]) --Find the newest record for each client 
     FROM [Artrxs] 
     group by clientid) 
    and [balance] <> 0) --only show clients who's newest record is not 0 
order by [clientid], [id] desc 

最糟糕的情况是,我在报表的代码中遍历列表,我可以开始跳过,直到我点击一个新的客户端ID。但我真的希望能够在一个SQL查询中完成这一切。

回答

3

您必须定义查询中前“0”的含义。在这种情况下,因为没有日期时间列,所以我假设ID也是按时间顺序排列的。这给了我这个查询:

WITH LastZeroByClient AS (
    SELECT ClientID, MAX(ID) AS ZeroID FROM Artrxs WHERE Balance = 0 GROUP BY ClientID 
) 
SELECT columns 
FROM Artrxs t 
INNER JOIN LastZeroByClient z ON h.ClientID=z.ClientID AND h.ID > z.ZeroID 

注意,我原本有一个LEFT JOIN,但后来我在你的问题是说你要排除的客户谁是最后的ID已经是零时以后发现的一个片段。

此外,您仍然可以使用派生表(子查询)执行此操作。我个人发现派生表更具可读性,但CTE更容易编写。

+0

我删除了日期时间列来简化我发布的表,但是,Id列是标识列,每增加一个新记录就会增加(因此新日期的记录将具有更高的ID) – 2010-12-15 16:43:53

+0

需要'where Balance = 0'在CTE中,我想呢? – Donnie 2010-12-15 16:44:44

+0

首先被定义为ID最高的记录 – 2010-12-15 16:45:31

相关问题