SQL Server 2012 – Utilisation de ROW_NUMBER () sur DISTINCT

J'ai une requête ci-dessous.

SELECT DISTINCT FORMAT(CAST(SchedTi AS DATETIME),'hh:mm tt') AS SchedTimeIn, FORMAT(CAST(SchedTO AS DATETIME),'hh:mm tt') AS SchedTimeOut FROM tblemployee_schedule ORDER BY SchedTimeIn 

Il renvoie ce résultat:

 SchedTimeIn SchedTimeOut 01:00 AM 09:00 AM 01:00 AM 10:00 AM 01:00 AM 10:00 PM 01:15 AM 05:15 AM 01:15 AM 10:15 AM 01:30 AM 05:30 AM 01:30 PM 10:30 PM 01:45 AM 05:45 AM 

Mon résultat souhaité est:

 SchedTimeIn SchedTimeOut ROWNUM 01:00 AM 09:00 AM 1 01:00 AM 10:00 AM 2 01:00 AM 10:00 PM 3 01:15 AM 05:15 AM 4 01:15 AM 10:15 AM 5 01:30 AM 05:30 AM 6 01:30 PM 10:30 PM 7 01:45 AM 05:45 AM 8 

J'ai essayé la requête suivante:

 SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY SchedTi), FORMAT(CAST(SchedTi AS DATETIME),'hh:mm tt') AS SchedTimeIn, FORMAT(CAST(SchedTO AS DATETIME),'hh:mm tt') AS SchedTimeOut FROM tblemployee_schedule ORDER BY SchedTimeIn 

Mais il renvoie trop de lignes redondantes et de valeurs NULL.

Merci d'avance.

Essayez le ci-dessous,

 SELECT * ,ROW_NUMBER() OVER(ORDER BY SchedTimeIn) AS ROWNUM FROM ( SELECT DISTINCT FORMAT(CAST(SchedTi AS DATETIME),'hh:mm tt') AS SchedTimeIn, FORMAT(CAST(SchedTO AS DATETIME),'hh:mm tt') AS SchedTimeOut FROM tblemployee_schedule ) AS D ORDER BY ROWNUM 

Dans votre requête ROW_NUMBER() produire un nouveau numéro de séquence pour chaque logging, de sorte que la key DISTINCT ne wok pour le même, c'est pourquoi vous obtenez trop d'loggings redondants. Vous pouvez donc utiliser le ROW_NUMBER() dans une requête externe pour surmonter cela.

Le problème principal est que vous ne posez qu'une partie du problème. En premier lieu, en utilisant distinct, order by, row_number dans la même requête semble faux. en utilisant seulement la fonction de partition est assez.

de toute façon en utilisant votre requête,

 select * ,ROW_NUMBER()over(order by SchedTimeIn)rn FROM ( SELECT DISTINCT FORMAT(CAST(SchedTi AS DATETIME),'hh:mm tt') AS SchedTimeIn, FORMAT(CAST(SchedTO AS DATETIME),'hh:mm tt') AS SchedTimeOut FROM tblemployee_schedule ORDER BY SchedTimeIn )tbl