1
votes

Ajout d'une clause conditionnelle (Où) à la fonction de rang dense

Je souhaite créer une fonction de classement pour compter le nombre de fois qu'une personne a visité la propriété BY DATE mais à condition de ne pas inclure de catégorie de visite. 'Appels'

1046        Red Property      30/10/2019           Field                  2                      
10467       Red Property      29/10/2019           Field                  1
10591       Red Property      28/10/2019          Calls                   
10971       Blue Property     27/10/2019           Field                  2
10971       Blue Property     26/10/2019           Field                  1
10971       Blue Property     26/10/2019           calls                     
10965       Green Property    24/10/2019           calls
10765       Green Property    23/10/2019           calls
10765       Green Property    19/10/2019           field                  3
10765       Green Property    15/10/2019           field                  2
10765       Green Property    12/10/2019           field                  1

Faire ceci classe l'ensemble de la table de communication dont je ne veux pas.

---- ActivityID ---------- Propriété -------- DATE --- --- CommunicationType ---------------- Rang

DENSE_RANK() over(partition by activitytable.[Property] 
ORDER BY activitytable.[Date] as Job rank

Idéalement, je veux que le tableau apparaisse comme ci-dessus pour ignorer les éléments des appels de la colonne type de communication et ne comptez que la catégorie des champs. Comment pourrais-je faire cela?


1 commentaires

Veuillez montrer les résultats que vous souhaitez.


3 Réponses :


1
votes

Essayez simplement:

CASE WHEN CommunicationType <> 'CAlls' THEN DENSE_RANK() over(partition by activitytable.[Property] ORDER BY activitytable.[Date] ELSE NULL END AS Job rank


4 commentaires

Je pense que vous devez également partitionner par CommunicationType .


@Alex Fondamentalement, je copie simplement la clause OP - le point clé ici est d'utiliser CASE WHEN ou IIF pour exclure certaines des lignes du classement - la clause de classement peut être comme il aime.


Je pense que vous n'excluez pas les lignes du classement de cette façon, vous ne masquez que la valeur dans Select, c'est-à-dire que la valeur est comptée dans le classement, mais pas affichée. Identique à CASE ... SUM est différent de SUM (CASE ... .


Merci pour votre réponse, fonctionne presque mais cela ne complète pas ignore les valeurs nulles et les saute simplement comme. 1,2,3 nul, 5 etc.



1
votes

Vous n'avez pas de dates en double, alors utilisez simplement une somme cumulative:

select (case when communicationtype = 'Visits'
             then dense_rank() over (partition by activitytable.[Property], communicationtype
                                     order by activitytable.[Date]
                                    )
        end) as job_rank

Vous avez probablement aussi une colonne qui représente la "personne", si vous voulez ce classement par personne.

/ p>

Si vous avez besoin de dense_rank () parce qu'il y a des doublons, alors la réponse est plus difficile. Ce qui suit doit faire ce que vous voulez:

sum(case when communicationtype <> 'Calls'
         then 1 else 0
    end) over (partition by activitytable.[Property] order by activitytable.[Date]
              ) as Job_rank

Remarque: la valeur n'apparaîtra pas sur les lignes avec Appels . On ne sait pas si cela est nécessaire.


1 commentaires

Merci, cela semble fonctionner. L'essentiel ici est d'ajouter le type de communication à la partition avec l'instruction case when. Acclamations



2
votes

Vous devez partitionner par Propriété et CommunicationType:

Table:

ActivityID  Property    DATE        CommunicationType   Rank
10971   Blue Property   2019-10-26  calls               NULL
10971   Blue Property   2019-10-26  field               1
10971   Blue Property   2019-10-27  field               2
10765   Green Property  2019-10-23  calls               NULL
10965   Green Property  2019-10-24  calls               NULL
10765   Green Property  2019-10-12  field               1
10765   Green Property  2019-10-15  field               2
10765   Green Property  2019-10-19  field               3
10591   Red Property    2019-10-28  calls               NULL
10467   Red Property    2019-10-29  field               1
1046    Red Property    2019-10-30  field               2

Déclaration: p>

SELECT 
    *,
    CASE 
        WHEN CommunicationType = 'field' THEN DENSE_RANK() OVER (PARTITION BY Property, CommunicationType ORDER BY [DATE] ASC)
        ELSE NULL
    END AS Rank
FROM #Data

Résultat:

CREATE TABLE #Data (
    ActivityID int,
    Property varchar(100),
    [DATE] date,
    CommunicationType varchar(10)
)
INSERT INTO #Data
    (ActivityID, Property, [DATE], CommunicationType)
VALUES
    (1046,  'Red Property',    '20191030', 'field'),
    (10467, 'Red Property',    '20191029', 'field'),
    (10591, 'Red Property',    '20191028', 'calls'),
    (10971, 'Blue Property',   '20191027', 'field'),
    (10971, 'Blue Property',   '20191026', 'field'),
    (10971, 'Blue Property',   '20191026', 'calls'),
    (10965, 'Green Property',  '20191024', 'calls'),
    (10765, 'Green Property',  '20191023', 'calls'),
    (10765, 'Green Property',  '20191019', 'field'),
    (10765, 'Green Property',  '20191015', 'field'),
    (10765, 'Green Property',  '20191012', 'field')


1 commentaires

@ shevchenko2020 J'espère que cela aide. Si vous pensez que telle ou telle réponse est la meilleure solution à votre problème, vous pouvez l'accepter (une seule réponse peut être acceptée). Merci.