2015-11-09 1 views
1

Je travaille avec le moteur GreenPlum, j'utilise pgAdmin pour interroger les données, je n'ai que des permissions de lecture, donc je ne peux pas faire une fonction ou une procédure, même je ne sais pas pourquoi je ne peut pas travailler avec des variables.Partition partition par la même valeur

C'est mes données et le résultat souhaité:

 
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 

C'est l'une de mes tentatives:

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; 

La valeur souhaitée est un compte de la consécution de la valeur Actividad, j'ai besoin pour réinitialiser le compte lorsque Actividad est 0.

+1

Il serait utile que les noms de champs de votre requête tentée correspondent à vos données d'échantillon. À l'heure actuelle, il est difficile d'en comprendre le sens. – sstan

+0

Copie possible de [T-sql Réinitialiser le numéro de ligne lors d'un changement de champ] (http://stackoverflow.com/questions/13405264/t-sql-reset-row-number-on-field-change) –

+1

Votre résultat souhaité vous suggère vouloir réinitialiser le compte avec chaque * changement * dans 'Actividad', pas 'quand' Actividad 'est 0'. Correct? –

Répondre

5

L'astuce consiste à former des groupes de lignes consécutives avec le même Actividad, alors vous un calculer facilement le numéro de ligne (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; 

Vous devez répéter les colonnes (ou expressions) dans la PARTITION BY clause dans la requête externe en plus degrp. Il est relativement bon marché de répéter le même ordre de lignes dans la fonction de fenêtre extérieure et d'ajouter une autre colonne, en s'appuyant sur des données pré-triées.

Certaines des colonnes peuvent être supprimées de la clause PARTITION BY en fonction de la définition de table manquante (quelles colonnes sont uniques?) Et des conditions WHERE.

SQL Fiddle avec un cas de test étendu.

cas très similaire:

réponse avec explication détaillée connexes sur dba.SE:

BTW, il ne fait jamais sens e pour répéter les colonnes de la clause ORDER BY d'une fonction de fenêtre qui sont utilisées dans la clause PARTITION (Pais et Representante dans votre requête d'origine). C'est juste du bruit sans effet.

+1

Il y a beaucoup de 'Representante' de sorte que la partition en devrait être comme: row_number() OVER (PARTITION PAR Representante, Actividad, ORDER grp Campana) AS rn S'il vous plaît changer cela, votre awnser me aider beaucoup. – MelgoV

+0

@MelgoV: À droite, nous devons répéter les colonnes dans la partie 'PARTITION BY' externe pour que cela fonctionne dans tous les cas. –