Search code examples
sql-server-2008duplicatesdistinct-values

Select first record from duplicated values in SQL Server


I have this Query:

Select DFC_NOMBRE_CAMPO, DFC_TITULO, TDT_DATO_MOTOR, DFC_LONGITUD
FROM MEM_DEFINICIONES_CAMPOS JOIN MEM_TIPOS_DATOS ON DFC_TDT_CODIGO = TDT_CODIGO 
WHERE DFC_ALMACENAR_BASEDATOS = 'S'
ORDER BY DFC_NOMBRE_CAMPO ASC, DFC_LONGITUD DESC

And the Result, give me duplicated values:

DFC_NOMBRE_CAMPO                                   DFC_TITULO                                         TDT_DATO_MOTOR       DFC_LONGITUD
-------------------------------------------------- -------------------------------------------------- -------------------- ---------------------------------------
CodigoRespuesta                                    Cod. Respuesta                                     Varchar              3
CodigoRespuesta                                    Cod. Resp.                                         Numeric              3
CodigoRespuesta                                    Cod Respuesta                                      Numeric              3
CodigoTransaccion                                  NULL                                               Numeric              2
CodigoTransaccion                                  Codigo Transaccion                                 Numeric              2
CodigoTransaccion                                  Codigo Transaccion                                 Numeric              2
Estado                                             Estado                                             Numeric              2
FechaHora                                          Fecha                                              Varchar              14
FechaHora                                          Fecha                                              Varchar              14
FechaHora                                          Fecha                                              Varchar              14
NUT                                                NUT                                                Numeric              9
NUT                                                NUT                                                Numeric              8
NUT                                                NUT                                                Numeric              8                                           

How I can obtain only the firs record from each (DFC_NOMBRE_CAMPO) group. Like This:

DFC_NOMBRE_CAMPO                                   DFC_TITULO                                         TDT_DATO_MOTOR       DFC_LONGITUD
-------------------------------------------------- -------------------------------------------------- -------------------- ---------------------------------------
CodigoRespuesta                                    Cod. Respuesta                                     Varchar              3
Estado                                             Estado                                             Numeric              2
FechaHora                                          Fecha                                              Varchar              14
NUT                                                NUT                                                Numeric              9

Solution

  • Try this:

    ;
    WITH CTE AS
         (
             SELECT DFC_NOMBRE_CAMPO,
                    DFC_TITULO,
                    TDT_DATO_MOTOR,
                    DFC_LONGITUD,
                    ROW_NUMBER() OVER(
                        PARTITION BY DFC_NOMBRE_CAMPO ORDER BY DFC_NOMBRE_CAMPO ASC,
                        DFC_LONGITUD DESC
                    ) Rn
             FROM   MEM_DEFINICIONES_CAMPOS
                    JOIN MEM_TIPOS_DATOS
                         ON  DFC_TDT_CODIGO = TDT_CODIGO
             WHERE  DFC_ALMACENAR_BASEDATOS = 'S'
         )
    
    SELECT *
    FROM   CTE
    WHERE  Rn = 1