2016-02-17 1 views
0

Я смог использовать LAG для получения данных из предыдущей строки, но я изо всех сил пытаюсь использовать ее для решения более сложной проблемы.SQL Server 2012 - использование LAG для получения данных из предыдущих строк

По существу для каждого эпизода в моем столе может быть, скажем, 10 уникальных посетителей. Каждое посещение имеет значение 1, 2 или 3.

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

например.

Episode Attendance Value New Value 
12345  1  1  1 
12345  2  1  1 
12345  3  2  2 
12345  4  1  2 
12345  5  1  2 
12345  6  2  2 
12345  7  3  3 
12345  8  1  3 
12345  9  1  3 
12345  10  1  3 
34567  1  1  1 
34567  2  2  2 
34567  3  1  2 
34567  4  2  2 
34567  5  1  2 
34567  6  3  3 
34567  7  1  3 
56789  1  2  2 
56789  2  1  2 
56789  3  1  2 

Таким образом, новое значение может увеличиться с 1 до 2 или 3 и от 2 до 3, но она никогда не должна уменьшаться.

Любая помощь с этим была бы весьма признательна. Использование LAG может быть неправильным ответом, но я немного начинаю, как вы могли бы собрать.

Вот SQL я получил до сих пор:

SELECT *, 


NewValue = 
CASE WHEN EPISODEID = Lag(EpisodeID,1) OVER(ORDER BY EpisodeID Asc) AND 
LAG(Value, 1) OVER(ORDER BY [EpisodeID] asc, Attendance) >= Value THEN LAG(Value,1) 
OVER(ORDER BY [EpisodeID] asc, Attendance) 

     ELSE  Value 
     END 
FROM TABLE 

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

Разочаровывающе, я мог бы сделать это в Excel, но я пытаюсь улучшить свои навыки SQL

+1

Только что понял, что он не оставил форматирование таблицы в моем примере таблицы - как я могу заставить его показать правильно? – Coxeymcqueen

+0

Посещаемость в нашей системе кодируется уровнем 1, 2 или 3, и меня просят подсчитать, сколько там уровней 2 и 3. Просто. Однако в эпизоде, если посещаемость на более высоком уровне, все последующие посещения должны учитываться на этом новом уровне. Предыдущие остаются неизменными. Таким образом, значения посещаемости в порядке 1,1,1,2,1,1,3 составят 1,1,1,2,2,2,3. – Coxeymcqueen

+0

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

ответ

1

Это решение использует КТР, чтобы решить эту проблему. CTE проверяет, в какой строке счетчик должен увеличиваться для каждой группы эпизодов и события посещаемости. Затем он присоединяется к вашему столу и назначает максимальное значение, которое должно иметь событие посещаемости на основе вашего эпизода.

;WITH CTE 
AS (
    SELECT episode 
     , value 
     , MIN(attendance) AS row_counter 

    FROM [your_table] 

    GROUP BY episode 
     , value 
    ) 

SELECT t.episode 
    , t.attendance 
    , t.value 
    , MAX(cte.value) AS new_Val 

FROM [your_table] t 

LEFT JOIN CTE 
    ON cte.episode = t.episode 
     AND t.attendance >= cte.row_counter 

WHERE cte.episode = t.episode 

GROUP BY t.episode 
    , t.attendance 
     , t.value 

ORDER BY t.episode 
    , t.attendance 
+0

Это ответ - не могу поблагодарить вас достаточно dfundako! Именно то, что мне нужно. – Coxeymcqueen

Смежные вопросы