2015-11-09 2 views
1

Я работаю с движком GreenPlum, я использую pgAdmin для запроса данных, у меня есть только разрешения на чтение, поэтому я не могу выполнить функцию или процедуру, даже не знаю, почему я не может работать с переменными.Разбить раздел по тому же значению

Это мои данные и желаемый результат:

 
Pais Campaña  Representante Actividad Racha **Desired value** 
96  20150302 758593197   1  1   1 
96  20150303 758593197   1  2   2 
96  20150304 758593197   1  3   3 
96  20150305 758593197   0  1   1 
96  20150306 758593197   1  4   1 
96  20150307 758593197   0  2   1 
96  20150308 758593197   0  3   2 
96  20150309 758593197   1  5   1 
96  20150310 758593197   0  4   1 
96  20150311 758593197   0  5   2 
96  20150312 758593197   0  6   3 
96  20150313 758593197   0  7   4 
96  20150314 758593197   1  6   1 

Это одна из моих попыток:

Select 
    Pais,Campaña,Representante,Actividad, 
    rank() over(partition by Pais,Representante,Actividad 
       order by Pais,Campaña,Representante) as Racha 
From TEMP20151109 
Order By Campaña; 

Требуемое значение является подсчет consecutiveness значения Actividad, мне нужно для сброса счетчика, когда Actividad равен 0.

+1

Это поможет, если имена полей вашего запроса совпадают с вашими данными примера. Прямо сейчас, это трудно понять. – sstan

+0

Возможный дубликат [T-sql Сбросить номер строки при изменении поля] (http://stackoverflow.com/questions/13405264/t-sql-reset-row-number-on-field-change) –

+1

Ваш желаемый результат подсказывает вам хотите сбросить счет с каждым * изменением * в 'Actividad', а не' когда 'Actividad' равен 0'. Верный? –

ответ

5

Трюк состоит в том, чтобы сформировать группы последовательных строк с одинаковыми Actividad, тогда вы c легко вычислить номер строки (rn):

SELECT Pais, Campana, Representante, Actividad 
    , row_number() OVER (PARTITION BY Pais, Representante, Actividad, grp 
          ORDER BY Campana) AS rn 
FROM (
    SELECT Pais, Campana, Representante, Actividad 
     , row_number() OVER (PARTITION BY Pais, Representante ORDER BY Campana) 
     - row_number() OVER (PARTITION BY Pais, Representante, Actividad 
          ORDER BY Campana) AS grp 
    FROM tbl 
    ) sub 
ORDER BY Campana; 

Вы должны повторять столбцы (или выражение) в пункте PARTITION BY во внешнем запросе в дополнении кgrp. Сравнительно дешево повторять один и тот же порядок строк в функции внешнего окна и просто добавлять другой столбец, основываясь на предварительно отсортированных данных.

Некоторые столбцы могут быть отброшены из предложения PARTITION BY в зависимости от определения отсутствующей таблицы (какие столбцы уникальны?) И условий WHERE.

SQL Fiddle с расширенным чеком.

Очень похожий случай:

Относящиеся ответ с подробным объяснением на dba.SE:

Кстати, он никогда не делает Sens e для повторения столбцов в предложении ORDER BY функции окна, которые используются в предложении PARTITION (Pais и Representante в исходном запросе). Это просто шум без эффекта.

+1

Есть много '' Representante поэтому раздела, должно быть, как: row_number() OVER (PARTITION BY Representante, Actividad, GRP ORDER BY Кампана) AS гп Пожалуйста, измените что ваш awnser мне очень помогают. – MelgoV

+0

@MelgoV: Правильно, нам нужно повторить столбцы во внешнем 'PARTITION BY', чтобы он работал для всех случаев. –

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