-2
votes

J'ai besoin d'un rang_number sur la partition pour y parvenir dans SQL Server

J'ai trois colonnes PID, AppNo et TRANSEDDATE J'ai besoin d'une requête pour mettre à jour l'Appno dans le format ci-dessous xxx

pour l'instant, la colonne Appno est null.

Ceci est le SQL qui ne fonctionne pas xxx


4 commentaires

Pourquoi 1ère rangée a appno 3 au lieu de 1?


Oh vraiment désolé. Je l'ai mis à jour.


Où sont les données d'échantillonnage et où sont les résultats attendus des deux? Ils sont tous deux identiques


Le résultat que je veux est Appno, je suis sûr que vous comprenez la logique avant de me demander de mettre à jour la question. Je dois mettre à jour la table avec les valeurs dans l'application N ° Les données d'échantillon sur le sol sont la colonne 1 et 3. Colonne 2 (Appno) est null pour le moment, mais ces valeurs sont ce que je veux mettre à jour la colonne avec


5 Réponses :


0
votes

Query. XXX


0 commentaires

0
votes

convert traitementddate à ce jour si Row_Number ne devrait pas considérer le temps comme: xxx

Vous pouvez écrire une mise à jour comme suit: xxx < / pré>

et tester le résultat comme: xxx

code ici ..


1 commentaires

Vous avez résolu 80% de mon problème car je peux obtenir exactement ce qui se trouve sur la table de ma table en direct. Mais maintenant, comment puis-je le mettre à jour? Merci beaucoup



1
votes

Vous semblez chercher à mettre à jour votre table d'origine. Vous pouvez utiliser row_number () code> dans une CTE pour classer des enregistrements avec des groupes ayant la même date (sans temps) et pid, commandé par date (avec le temps), puis effectuez la mise à jour à la volée:

PID | AppNo | ProcessedDate   
--: | ----: | :---------------
 11 |     1 | 09/30/2019 18:21
  3 |     1 | 09/25/2019 08:37
  3 |     2 | 09/25/2019 08:37
 11 |     1 | 09/25/2019 08:39
 11 |     2 | 09/25/2019 08:40
  7 |     1 | 09/26/2019 14:19
  7 |     2 | 09/26/2019 14:20
  7 |     3 | 09/26/2019 14:22
  2 |     1 | 09/26/2019 14:23
 11 |     1 | 09/26/2019 14:23
 11 |     2 | 09/26/2019 14:24
 11 |     3 | 09/26/2019 14:24
  3 |     1 | 09/26/2019 14:24


3 commentaires

Solution parfaite. Tu es un sauveur. Tous les conseils sur la manière de le rendre dynamique et de réduire la durée de calcul de la colonne déjà de mise à jour, je veux dire puis-je utiliser non null pour appno puis regrouper le script dans une procédure stockée pour exécuter lorsqu'une valeur null est trouvée. . Peut-être un déclencheur ou quelque chose


@Petergodfreyobike: Oui Vous pouvez ajouter une condition dans la requête externe pour mettre à jour uniquement les valeurs non nulles, telles que Mettre à jour CTE Set appno = rn où appno n'est pas null . Méfiez-vous cependant que vous devez conserver la numérotation cohérente (que se passe-t-il si vous devez modifier un numéro de ligne déjà affecté, par exemple si un CréeredDate est mis à jour?).


Votre question perçue est déjà un problème, alors j'ai dû supprimer le non nul et utiliser votre script initial dans le programme. Mais je pense que cela a de la manière de réduire le temps d'exécution de la requête, mais c'est ok. Comme la table devient des largeurs, ce sera un problème. Je l'ai fait une procédure stockée. Je peux le modifier à tout moment de l'emplacement éloigné. S'il vous plaît si vous avez une autre idée, faites le moi savoir



0
votes

Vous devez utiliser la partition juste avec la date de date, comme ceci: xxx


1 commentaires

Vous ne devriez pas modifier le type de données de la date à varchar () sauf si cela n'est vraiment requis que le but de représentation.



0
votes

si traitementddate code> est de type DateTime code> Vous pouvez simplement faire xxx pré>

si traitementddate code> est de type Varchar Code> Vous pouvez simplement faire P>

;WITH
t as (
    SELECT  pid, convert(datetime, ProcessedDate, 120) ProcessedDate
    from table
)
SELECT 
    pid, 
    ROW_NUMBER() OVER (
        PARTITION BY pid, convert(date, ProcessedDate) 
        ORDER BY pid, ProcessedDate
    ) AppNo,
    ProcessedDate
FROM t


0 commentaires