Выбрать все строки до первого 0 в группе - PullRequest
0 голосов
/ 15 декабря 2010

Я пытаюсь составить список клиентов, и какова была их история 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

В худшем случае, я все равно перебираю список в коде для отчета, который я могу просто пропустить, пока не получу новый идентификатор клиента.Но мне бы очень хотелось сделать все это одним SQL-запросом.

1 Ответ

3 голосов
/ 15 декабря 2010

Вы должны определить, что означает «первый» для первых 0 в вашем запросе.В этом случае, поскольку столбец datetime отсутствует, я предполагаю, что идентификаторы также последовательны по времени.Это дает мне такой запрос:

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

Обратите внимание, что у меня изначально было левое соединение, но потом я заметил фрагмент вашего вопроса, который сказал, что вы хотите исключить клиентов, у которых последний идентификатор уже равен нулю.

Кроме того, вы все еще можете сделать это с производной таблицей (подзапрос).Лично я нахожу производные таблицы более удобочитаемыми, но CTE легче писать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...