选择组中第一个0的所有行

时间:2010-12-15 16:29:56

标签: sql-server-2005

我正在尝试构建一个客户列表,以及它们的AR历史记录是什么时候它最后一次是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

请注意,记录62144和61662未包括在内,因为它们之间有一个0和前两个记录。

删除像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查询中完成所有这些。

1 个答案:

答案 0 :(得分:3)

您必须定义查询中第一个0的“第一个”含义。在这种情况下,由于没有datetime列,我假设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更容易编写。