Мой проект использует базу данных Oracle SQL.У меня есть хронологическая таблица, которая добавляет статус задачи на еженедельной основе, и я пытаюсь запросить количество недель, в течение которых задача, которая в данный момент отклоняется от нормы, была отклонена.Вот пример выдержки из моей исходной исторической таблицы:
ID WEEK ON_TRACK
1 1 N
1 2 Y
1 3 N
1 4 N
1 5 N
2 1 N
2 2 N
2 3 Y
2 4 Y
2 5 N
3 1 N
3 2 N
3 3 Y
3 4 Y
3 5 Y
Я хочу вернуть количество последовательных "N" значений в ON_TRACK, начиная с последнего добавления.Для приведенных выше примеров данных я бы хотел, чтобы запрос возвращал:
ID WKS_OFF_TRACK
1 3
2 1
3 0
Я провел некоторое исследование, и похоже, что метод Табибитозан является наиболее логичным, и я нашел достаточнопримеры для получения максимальных последовательных значений, которые соответствуют 1 критерию, но у меня возникают проблемы с настройкой, чтобы вернуть самые последние последовательные значения, которые соответствуют 2 критериям (ID и ON_TRACK).*
--this step creates a temp table with unique IDs for each weekly append to the historical table, and a 1 (if ON_TRACK = N) or 0 (if ON_TRACK = Y). This results in the expected info.
WITH HIST_TBL AS (
SELECT DISTINCT(ID),
CASE ON_TRACK
WHEN 'N' THEN 1
ELSE 0
END AS OFF_TRACK,
WEEK
FROM SOURCE_HISTORICAL_TBL
ORDER BY ID,WEEK DESC)
-- end of temp table
--this is where Im struggling I want one line per project number, and the sum of the latest string of 1s (weeks the task has been off track), until a 0 is reached.
SELECT ID,
SUM(OFF_TRACK) AS WKS_OFF_TRACK
FROM (SELECT WEEK,
ID,
OFF_TRACK,
ROW_NUMBER() OVER (ORDER BY WEEK DESC) - ROW_NUMBER() OVER
(PARTITION BY ID,OFF_TRACK ORDER BY WEEK DESC) GRP
FROM HIST_TBL)
GROUP BY ID, GRP
ORDER BY ID;
Этот код приводит к совокупной сумме всех недель, в течение которых не выполнялся каждый проект, для данных моего примера:
ID WKS_OFF_TRACK
1 4
2 3
3 2
Любые идеи, где я ошибаюсь