我正在尝试构建一个客户列表,以及它们的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查询中完成所有这些。
答案 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更容易编写。