13

estoy utilizando este código: (a partir de esta pregunta: How to get the last record per group in SQL sustituyendo mis propias columnas)¿Es posible usar ROW_NUMBER() OVER/PARTITION BY solo cuando otra columna también es la misma?

WITH e AS 
(
SELECT *, 
    ROW_NUMBER() OVER 
    (
     PARTITION BY ApplicationId 
     ORDER BY theDate DESC 
    ) AS Recency 
FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 

¿Es posible 'partición' sólo si dos campos son los mismos? Por ejemplo, tengo datos como estos:

ID  Name theDate 
123  John 01/01/2012 
123  John 01/02/2012 
123  Doe  01/01/2012 
456  Smith 02/04/2012 
789  Smith 02/01/2012 
789  Smith 02/09/2012 
789  Roger 02/08/2012 

Desde que los datos que me gustaría volver:

ID  Name theDate 
123  John 01/02/2012 
123  Doe  01/01/2012 
456  Smith 02/04/2012 
789  Smith 02/09/2012 
789  Roger 02/08/2012 

Gracias por cualquier ayuda.

Thomas

+0

Respuesta idéntica, de modo que diferir a la más antigua –

+0

Esto debe ser tarea. – JeffO

+0

@JeffO no ... Solo trato de no pegar los datos del cliente cuando puedo evitarlo. – tsdexter

Respuesta

4

lo he encontrado la respuesta aquí: Table partitioning using 2 columns

Sólo puede partición en la columna 1, sin embargo, que la columna se puede generar para hacer una 'partición múltiple' como así:

WITH e AS 
( 
SELECT *, 
ROW_NUMBER() OVER 
( 
    PARTITION BY CONVERT(VARCHAR(100),ApplicationId) + ' ' + Name 
    ORDER BY theDate DESC 
) AS Recency 
FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 

Agregar las dos columnas juntas como una sola cadena garantiza que solo se dividirá si ambas columnas son idénticas.

+2

Creo que está confundiendo 'partitioning de tabla' con' PARTITION BY' - mientras que se nombran de manera similar, no están relacionados de ninguna manera. Ciertamente no está limitado a una columna o expresión en 'PARTITION BY' y no hay necesidad de su llamada '' partición múltiple '' ... –

+0

@ AaronBertrand Sí me doy cuenta de que el enlace que publiqué es sobre partición de tabla y yo ' m usando PARTITION BY sin embargo, lo que dijo el tipo que respondió esa pregunta se aplica también aquí. La sugerencia anterior (campo1, campo2) no funciona para devolver los datos de la forma en que la necesito, mientras que el código que proporcioné basado en la respuesta del enlace (Campo1 + '' + Campo2) proporciona los datos adecuados ... esta no es la forma correcta de hacerlo? – tsdexter

+0

@AaronBertrand No probé completamente los resultados, pero creo que PARTITION BY campo1, campo2 primera partición en el primer campo y luego otras particiones que resultan en el segundo campo, ¿es correcto? Eso no es lo que necesito. – tsdexter

30

Puede haber varias columnas separados por una coma

WITH e AS 
( 
SELECT *, 
    ROW_NUMBER() OVER 
    ( 
     PARTITION BY ApplicationId , Name 
     ORDER BY theDate DESC 
    ) AS Recency 
FROM [Event] 
) 
SELECT * 
FROM e 
WHERE Recency = 1 
+0

¿Lo ha intentado? La documentación de Over (http://msdn.microsoft.com/en-us/library/ms189461.aspx) no es clara sobre cuántas columnas puede especificar. – 000

+0

Esto no funciona como se esperaba. Todavía particiona TODOS los que tienen la misma ID y luego supongo que particiones adicionales basadas en la segunda columna. Ver mi respuesta agregué. – tsdexter

+2

+1. Esto funciona exactamente como se pretendía y proporciona la respuesta exacta que solicitó en la pregunta. Si no es así, debe explicar cómo. Sospecho que en realidad no lo has probado porque tu descripción de cómo no funcionó no coincide con lo que realmente hace. –

Cuestiones relacionadas