Sql server 2005 选择组中第一个0之前的所有行
我正在尝试建立一个客户列表,以及上次0时他们的AR历史记录是什么。这里有一个例子 我想把这个Sql server 2005 选择组中第一个0之前的所有行,sql-server-2005,Sql Server 2005,我正在尝试建立一个客户列表,以及上次0时他们的AR历史记录是什么。这里有一个例子 我想把这个 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 6
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,我可以做一个平衡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
从[Artrxs]中选择*
[clientid]在哪里(
选择[ClientID]
来自[Artrxs]
[id]在哪里(
选择max([id])——查找每个客户端的最新记录
来自[Artrxs]
分组(按客户ID)
和[余额]0--仅显示最新记录不是0的客户
订单由[客户id],[id]描述
最糟糕的情况是,我在报告的代码中迭代列表,我可以开始跳过,直到找到一个新的客户端ID。但我真的希望能够在一个SQL查询中完成这一切。您必须定义“第一个”对于查询中的第一个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
请注意,我最初有一个左连接,但后来我注意到在您的问题中有一个片段说您想排除最后一个ID已经为零的客户
此外,您还可以使用派生表(子查询)来执行此操作。我个人认为派生表更可读,但CTE更容易编写。您必须定义查询中第一个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
请注意,我最初有一个左连接,但后来我注意到在您的问题中有一个片段说您想排除最后一个ID已经为零的客户
此外,您还可以使用派生表(子查询)来执行此操作。我个人认为派生表更可读,但CTE更容易编写。我删除了datetime列以简化我发布的表,但是的,Id列是identity列,仅随每个新添加的记录而递增(因此日期较新的记录将具有更高的Id),需要在CTE中使用
where Balance=0
,我认为?第一个定义是idI最高的记录删除了datetime列以简化我发布的表,但是是的,Id列是标识列,仅随每个新添加的记录而递增(因此日期较新的记录将具有较高的Id),需要在CTE中使用其中Balance=0
,我认为?第一个定义是id最高的记录