Похоже, пришло время использовать аналитическую функцию LEAD (), чтобы посмотреть в будущее для данного клиента member_Type; сравните его с текущей записью, а затем оцените, будет ли это повышение или понижение, а затем суммируйте результаты.
DEMO
CTE AS (SELECT case when lead(Member_Type_Code) over (partition by Customer order by date asc) > member_Type_Code then 1 else 0 end as Upgrade
, case when lead(Member_Type_Code) over (partition by Customer order by date asc) < member_Type_Code then 1 else 0 end as DownGrade
FROM member_detail_daily_changes_new
WHERE Date between '20190101' and '20190201')
SELECT sum(Upgrade) upgrades, sum(downgrade) downgrades
FROM CTE
Давать нам: используя мои данные образца
+----+----------+------------+
| | upgrades | downgrades |
+----+----------+------------+
| 1 | 3 | 2 |
+----+----------+------------+
Я не уверен, что SQL Express на Rex Tester просто не поддерживает sum () для самого аналитика, поэтому мне пришлось добавить CTE или это правило также и в версиях, отличных от SQL Express.
Некоторые другие заметки:
- Я позволил системе неявно приводить даты в предложении where
- Я предполагаю, что сам member_Type_Code сообщает мне, является ли это обновлением или понижением, которое в долгосрочной перспективе, вероятно, не подходит. Скажем, мы добавляем тип членства 3, и он идет между 1 и 2 ... и что теперь ... Так что, может быть, нам нужно десятичное число вне Member_Type_Code, чтобы мы могли обрабатывать будущие членства, а также, если это повышение / понижение или боковая версия .. .
- Я предположил, что все улучшения / понижения подсчитываются, и пользователь может быть подсчитан несколько раз, если членство изменилось так часто за желаемый период времени.
- Я предполагаю, что обновление / понижение не может произойти в тот же день / время. В противном случае сортировка по свинцу может работать неправильно. (но если это поле с отметкой времени, у нас не должно быть проблем)
Так как это работает?
Мы используем общее табличное выражение (CTE) для генерации желаемых оценок понижения / обновления для каждого клиента. Это можно сделать и в производной таблице, но я считаю, что CTE легче читать; и затем мы подведем итоги.
Lead(Member_Type_Code) over (partition by customer order by date asc)
делает следующее
Он организует данные по клиенту, а затем сортирует их по дате в порядке возрастания.
Таким образом, мы получаем все те же записи клиентов в последующих строках, упорядоченных по дате. После этого поле (поле) начинается с записи 1 и просматривает запись 2 для того же клиента и возвращает Member_Type_Code записи 2 в записи 1. Затем мы можем сравнить эти коды типов и определить, произошло ли обновление или понижение. Затем мы можем суммировать результаты сравнения и предоставить желаемые итоги.
А теперь у нас длинное объяснение очень маленького запроса: P