Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 选择组中第一个0之前的所有行_Sql Server 2005 - Fatal编程技术网

Sql server 2005 选择组中第一个0之前的所有行

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

我正在尝试建立一个客户列表,以及上次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
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最高的记录