3 votes

Même numéro de ligne pour les mêmes valeurs

J'ai besoin d'avoir une numérotation de ligne où le ROW_NUMBER est le même pour la même colonne de valeur : MFGPN (le même MFGPN sera toujours dans la séquence). J'ai également besoin de maintenir la séquence originale par No.

Voici ma table

No     MFGPN
1      Z363700Z01
2      Z363700Z01
3      0119-960-1
4      1A3F1-0503-01

J'ai essayé d'utiliser RANK() pour obtenir le résultat souhaité, mais je rencontre des difficultés.

SELECT RANK() OVER(ORDER BY MFGPN) As [Item], MFGPN FROM Table1 ORDER BY [No] ASC

RÉSULTAT

Item   MFGPN           Desired Result
3      Z363700Z01            1
3      Z363700Z01            1
1      0119-960-1            2
2      1A3F1-0503-01         3

J'apprécie vos conseils d'experts. Je vous remercie.

6voto

MotoGP Points 35270

Utilice DENSE_RANK au lieu de RANK . Rank sautera la séquence en cas de répétition des données Dense_Rank ne le fera pas.

SELECT MFGPN,
        Dense_rank()OVER(ORDER BY m_no) as [Desired Result]
FROM   (SELECT no,
                MFGPN,
                Min(no)OVER(partition BY MFGPN) AS m_no
        FROM   (VALUES (1,'Z363700Z01' ),
                        (2,'Z363700Z01' ),
                        (3,'0119-960-1' ),
                        (4,'1A3F1-0503-01')) tc (no, MFGPN))a 

Si no n'est pas unique, alors changez DENSE_RANK a

Dense_rank()OVER(ORDER BY m_no,MFGPN)

Résultat :

+---------------+----------------+
|     MFGPN     | Desired Result |
+---------------+----------------+
| Z363700Z01    |              1 |
| Z363700Z01    |              1 |
| 0119-960-1    |              2 |
| 1A3F1-0503-01 |              3 |
+---------------+----------------+

0voto

Mureinik Points 61228

Vous devez répartir les résultats par mfgpn de sorte que les lignes ayant le même mfgpn obtiennent le même rang et sont classées par ordre d'importance. no . En outre, l'utilisation de dense_rank vous permettra de ne pas "sauter" de rangs :

SELECT   DENSE_RANK() OVER(PARTITION BY [mfgpn] ORDER BY [no]) As [Item], 
         [mfgpm] 
FROM     Table1 
ORDER BY [No] ASC

0voto

select      sum(case when MFGPN = prev_MFGPN then 0 else 1 end) over (order by No)  as item
           ,MFGPN

from       (SELECT      lag(MFGPN) over (order by [No]) as prev_MFGPN   
                       ,[No]
                       ,MFGPN 
            FROM        Table1 
            ) t

ORDER BY    [No] ASC

+------+---------------+
| item | MFGPN         |
+------+---------------+
| 1    | Z363700Z01    |
+------+---------------+
| 1    | Z363700Z01    |
+------+---------------+
| 2    | 0119-960-1    |
+------+---------------+
| 3    | 1A3F1-0503-01 |
+------+---------------+

0voto

Avrajit Roy Points 2614

Vous pouvez essayer l'extrait ci-dessous. DENSE_RANK() comme expliqué ci-dessus est la meilleure approche dans ce cas.

    SELECT a.*,
      DENSE_RANK() OVER(ORDER BY MFGPN DESC) RN
    FROM
      (SELECT 1 AS no, 'Z363700Z01' AS mfgpn FROM dual
      UNION ALL
      SELECT 2 AS no, 'Z363700Z01' AS mfgpn FROM dual
      UNION ALL
      SELECT 3 AS no, '0119-960-1' AS mfgpn FROM dual
      UNION ALL
      SELECT 4 AS no, '1A3F1-0503-01' AS MFGPN FROM dual
      )a;

-------------------------------OUTPUT-------------------------------------------
NO  MFGPN           RN
1   Z363700Z01      1
2   Z363700Z01      1
4   1A3F1-0503-01   2
3   0119-960-1      3

--------------------------------------------------------------------------------

0voto

Susang Points 4568

ESSAYEZ : Je pense qu'il est plus simple et plus souple à utiliser. join et comparez la valeur pour obtenir la sortie souhaitée, comme indiqué ci-dessous :

SELECT p.MFGPN,
       Dense_rank()OVER(ORDER BY CASE WHEN p.MFGPN = tp.MFGPN THEN tp.num ELSE p.num END) AS [Desired Result]
FROM tmp_option p
LEFT JOIN tmp_option tp ON tp.num+1 = p.num
ORDER BY p.num ASC

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X