Подсчитать все записи на основе последнего статуса - PullRequest
0 голосов
/ 24 октября 2019

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

Недавно мне пришлось посмотреть на исторические данные, чтобы найти количество раз, когда запись имелаотрицательный баланс последовательно.

Я могу сделать Row_number, чтобы подсчитать мне количество, основанное на типе баланса и имени дилера, но как получить только самый последний счет, основанный на самом текущем типе баланса?

With CTE
(Select processdate,
case when dealerbalance <'0.00' then 'Negative' 
else 'Positive' end 
as balancetype,
dealername
from Table A
where processdate >= '2019/10/20')
Select * from CTE

Вот некоторые примеры данных из таблицы:

Processdate | Balancetype |Dealername | Balance
2019-10-20      Positive     Luxe        20.00
2019-10-21      Positive     Luxe        20.00
2019-10-22      Negative     Luxe       -40.00
2019-10-23      Negative     Luxe       -40.00
2019-10-20      Positive     Max         15.00 
2019-10-21      Negative     Max        -25.00
2019-10-22      Negative     Max        -25.00
2019-10-23      Positive     Max         10.00
2019-10-20      Negative     main       -80.00
2019-10-21      Negative     Main       -90.00
2019-10-22      Negative     Main       -50.00
2019-10-23      Negative     Main       -100.00

Я хотел бы, чтобы мой вывод был таким:

Processdate | Balancetype |Dealername | NumberConsecutive | Balance
2019-10-23      Negative     Luxe          2                -40.00
2019-10-23      Positive     Max           1                 10.00
2019-10-23      Negative     Main          4                -100.00

1 Ответ

0 голосов
/ 24 октября 2019

попробуйте

WITH RNKS AS (SELECT *, row_number() OVER(partition by DealerName Order By  ProcessDate Desc) As RN FROM TableA),
     TOPS AS (SELECT * FROM RNKS WHERE RN = 1),
     DUR AS (SELECT * FROM TOPS OUTER APPLY (SELECT count (0) AS X FROM TableA A WHERE 
                                                                    A.processdate <= TOPS.processdate AND 
                                                                    A.DealerName = TOPS.DealerName AND
                                                                    NOT EXISTS (
                                                                    SELECT 0 FROM TABLEA A2 
                                                                          WHERE A2.processdate BETWEEN A.processdate AND TOPS.processdate
                                                                          AND A2.DealerName = TOPS.DealerName   
                                                                          AND A2.BalanceType != TOPS.BalanceType) 
                                            )DQ
            )
    SELECT DUR.processDate,Dur.balanceType, Dur.dealerName, Dur.x as NumberConsecutive FROM DUR;

по результатам испытаний на стенде, результаты выглядят нормально

select '2019-10-20' processdate,
       'Positive' BalanceType,
       'Luxe' DealerName,
       '20.00' balance 
            into TableA;


INSERT TableA values ('2019-10-21',      'Positive',     'Luxe',        20.00),
                     ('2019-10-20',      'Positive',     'Luxe',        20.00),
                     ('2019-10-19',      'Positive',     'Luxe',        20.00),
                     ('2019-10-18',      'neg',     'Luxe',        20.00),
                     ('2019-10-21',      'Positive',     'main       ',        20.00),
                     ('2019-10-20',      'neg',     'main       ',        20.00),
                     ('2019-10-19',      'Positive',     'main       ',        20.00),
                     ('2019-10-18',      'neg',     'main       ',        20.00); 
...