2014-09-19 3 views
1

je suit données d'échantillonPeupler nombre aléatoire en regroupant

ID Category Status Seq Start DT End DT 
1 CAT 1 U 1 17-Feb-11 17-Feb-11 
1 CAT 1 I 2 17-Feb-11 17-Feb-11 
1 CAT 1 X 0 17-Feb-11 3-Mar-11 
1 CAT 1 X 0 3-Mar-11 4-Mar-11 
1 CAT 1 X 0 4-Mar-11 28-Jun-11 
1 CAT 1 I 6 28-Jun-11 29-Jun-11 
1 CAT 1 X 0 29-Jun-11 15-Jul-11 
1 CAT 1 X 0 15-Jul-11 28-Jul-11 
1 CAT 1 X 0 28-Jul-11 28-Jul-11 
1 CAT 1 I 10 28-Jul-11 1-Aug-11 
1 CAT 1 D 11 1-Aug-11 8-Aug-11 
1 CAT 1 E 0 8-Aug-11 9-Aug-11 
1 CAT 1 E 0 9-Aug-11 1-Sep-11 
1 CAT 1 E 0 1-Sep-11 13-Sep-11 

Sortie prévue: -

ID Category Status Seq Start DT End DT 
1 CAT 1 U 1 17-Feb-11 17-Feb-11 
1 CAT 1 I 2 17-Feb-11 17-Feb-11 
1 CAT 1 X 0 17-Feb-11 3-Mar-11 
1 CAT 1 X 0 3-Mar-11 4-Mar-11 
1 CAT 1 X 0 4-Mar-11 28-Jun-11 
1 CAT 1 I 6 28-Jun-11 29-Jun-11 
1 CAT 1 X ***0A*** 29-Jun-11 15-Jul-11 
1 CAT 1 X ***0A*** 15-Jul-11 28-Jul-11 
1 CAT 1 X ***0A*** 28-Jul-11 28-Jul-11 
1 CAT 1 I 10 28-Jul-11 1-Aug-11 
1 CAT 1 D 11 1-Aug-11 8-Aug-11 
1 CAT 1 E 0 8-Aug-11 9-Aug-11 
1 CAT 1 E 0 9-Aug-11 1-Sep-11 
1 CAT 1 E 0 1-Sep-11 13-Sep-11 

La colonne "seq" est la colonne générée sql, qui est fondamentalement rownum. pour le même ensemble de valeurs dans la colonne d'état, les valeurs "seq" doivent rester identiques, par exemple 0 dans ce cas. mais pour l'ensemble suivant de mêmes valeurs d'état, la valeur "seq" devrait être différente de la précédente, par exemple 0A. pour tous les autres cas, la valeur seq sera juste rownum. Merci

+2

La capture d'écran ne décrit pas ce qui se passe, ni ce qui est supposé se produire. – wallyk

+0

Merci d'avoir répondu. J'ai utilisé SQL (rownum) pour générer la colonne SEQ. Lorsque "status" a la même valeur alors le "SEQ" aura une valeur différente (autre que rownum) par exemple. 0 dans ce cas. Mais si le même groupe de valeurs apparaît à nouveau pour "status" alors la colonne "seq" devrait avoir une valeur différente, par exemple 00. Mais dans mon cas, je reçois 0 pour chaque groupe de valeurs de statut. J'espère que cela aura du sens. – Harry

+2

@Harry, éditez votre question et ajoutez-y les informations pertinentes. Aussi mieux fournir quelques exemples de données et de sortie attendue, au lieu de joindre l'image. – Noel

Répondre

2

S'il suffit d'obtenir une valeur distincte pour tous les groupes, vous pouvez utiliser une clause SUM() OVER() pour générer les noms de groupe. Ici, je suppose que ORDER BY "Start DT", "End DT", "Seq" est suffisant pour obtenir l'ordre correct des lignes, donc vous voudrez peut-être régler ce si pas correct.

WITH cte AS (
    SELECT "ID", "Category", "Status", "Seq", "Start DT", "End DT", 
    SUM("Seq") OVER (ORDER BY "Start DT", "End DT", "Seq") "Seq2" 
    FROM mytable 
) 
SELECT "ID", "Category", "Status", 
    CASE WHEN "Seq"=0 
     THEN 'A' || CAST("Seq2" AS VARCHAR(32)) 
     ELSE CAST("Seq" AS VARCHAR(32)) 
     END "Seq", 
    "Start DT", "End DT" 
FROM cte 

Étant donné que les valeurs que nous voulons groupe ont la valeur 0, la somme va générer la même valeur pour chaque ligne (puisque la somme ne change pas lorsque l'on ajoute 0), donc on peut utiliser la somme pour générer un nom de groupe.

An SQLfiddle to test with.

+0

La requête fonctionne parfaitement, mais le problème est si j'ai des données comme STATUT \t \t START_DT \t END_DT \t E \t \t 03/février/12 \t 08/février/12 E \t \t 08/février/12 \t 13/Juillet/12 I \t \t 13/juillet/12 \t 31/juillet/12 I \t \t 31/juillet/12 \t 28/août/12 E \t \t 28/août/12 \t 06/SEP/12 E \t \t 06/SEP/12 \t 10/DEC/12 La requête ne génère pas les différents SEQ pour les deux derniers états "E". Il affectera le même SEQ que les deux premiers états "E" parce que le SEQ sera 0 pour les statuts "I" et la somme ne changera pas dans ce cas. Espérons que cela a du sens. Merci – Harry

+0

@Harry Hm, pourriez-vous mettre à jour le SQLfiddle que j'ai construit avec ces données? C'est un peu difficile à analyser dans un format de commentaire. –

+0

[Sample SQL Fiddle] (http://sqlfiddle.com/#!4/59ef9/4) Vous verrez que l'enregistrement 3,4,5 et 8,9 ont le même statut et seq. Mon exigence est différente SEQ pour ces groupes (un pour 3,4,5 et un pour 8,9) – Harry