2011-07-07 29 views
6

Cómo seleccionar registros más recientes si los registros están teniendo casi el mismo tipo de datos ...selección registro más reciente

ejemplo:

col1  col2   col3    col4 
-------------------------------------------------- 
123   abc   1.1    12345 
123   abc   1.1    123445 
1234  dsv   2.0    123 
1234  dsv   2.0    1233 
12345  dsvw   1.2    1234 

El máximo de col4 cuando se compara con el resto de la columnas

Ver los datos row1 y row2 es similar, pero necesitamos los últimos datos basados ​​en col4.

Lo mismo ocurre con row3 y row4, los datos son similares pero necesitamos los últimos datos basados ​​en col4.

Y la salida requerida es:

col1 col2 col3 col4 
---------------------------- 
123  abc 1.1 123445 
1234 dsv 2.0 1233 
12345 dsvw 1.2 1234 
+1

¿Qué quiere decir 'based on col4'? ¿Estás diciendo que para el mayor valor de col4? ¿Cuál sería su resultado deseado si la segunda fila tuviera 'abcd' porque es un valor' col2'? –

+1

Abe, me preguntaba lo mismo ... la respuesta puede considerar inapropiadas las soluciones 'GROUP BY'. –

+0

si el col2 tiene un valor diferente, entonces todo el escenario será diferente y tendré ese col. La salida entrará en acción cuando todas las filas sean iguales excepto el valor col4. – Shahsra

Respuesta

3

Uso:

WITH example AS (
    SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY t.col1 
           ORDER BY t.col4 DESC) AS rnk 
    FROM YOUR_TABLE t) 
SELECT e.* 
    FROM example e 
WHERE e.rnk = 1 

..o:

SELECT e.* 
    FROM (SELECT t.*, 
       ROW_NUMBER() OVER (PARTITION BY t.col1 
             ORDER BY t.col4 DESC) AS rnk 
      FROM YOUR_TABLE t) e 
WHERE e.rnk = 1 

El CTE no proporciona ninguna optimización sobre el enfoque de tablas derivadas.

0

Esto hace lo que quiere:

select * from table t 
where col4 = (select max(col4) from table where col1 = t.col1); 

Puede añadir otras columnas de la prueba según sea necesario (no está claro a partir pregunta si es necesario) , por ejemplo:

select * from table t 
where col4 = (select max(col4) from table 
       where col1 = t.col1 and col2 = t.col2 and col3 = t.col3); 

Nota: Esto devolverá varias filas si hay varios registros que tienen el mismo valor máximo para col4. Esto puede no ser un problema, o puede usar DISTINCT o algún otro tratamiento según sea necesario.

+0

tengo muchas gracias por la información .. – Shahsra

+0

El problema potencial con esto es que los valores de 'col4' podrían duplicarse, por lo que no devolvería filas distintas. Sería como usar la función DENSE_RANK ... –

-1

siento que me falta algo porque de todas las otras respuestas, pero me parece que esto es un simple MAX/group by:

with temp as 
(
select 123 as col1,'abc' as col2, '1.1' as col3, 12345 as col4 
UNION 
select 123, 'abc', '1.1' ,123445 
UNION 
select 1234,'dsv','2.0' ,123 
UNION 
select 1234,'dsv' ,'2.0' ,1233 

) 

SELECT col1, Col2, COl3, MAX(Col4) 
FROM temp 
GROUP BY col1, col2,col3 

Esto sería volver a los resultados deseados

+0

No. Eso no devolverá una sola fila por cada valor col1 - vea los resultados esperados en la pregunta – Bohemian

+0

Acabo de ejecutar la consulta anterior y lo hace.¿Tiene que ver con el conjunto de datos de muestra que dio? Siento que me falta algo aquí, pero no estoy seguro de qué ... –

+0

¿Qué sucede si col2 y col3 varían entre filas con una col1 determinada? No está claro a partir de la pregunta (pero sería casi inútil si no varió), en cuyo caso su consulta no funcionará. – Bohemian

5

Supongo que "último" significa "más grande"?

DECLARE @t TABLE 
(
    col1 INT, 
    col2 CHAR(3), 
    col3 DECIMAL(4,1), 
    col4 INT 
); 

INSERT @t SELECT 123, 'abc', 1.1, 12345 
UNION SELECT 123, 'abc', 1.1, 123445 
UNION SELECT 1234, 'dsv', 2.0, 123 
UNION SELECT 1234, 'dsv', 2.0, 1233; 

WITH t AS 
(
    SELECT col1, col2, col3, col4, 
     rn = ROW_NUMBER() OVER 
      (PARTITION BY col1 ORDER BY col4 DESC) 
     FROM @t 
) 
SELECT col1, col2, col3, col4 
    FROM t 
    WHERE rn = 1; 
+0

.... Slowpoke: p –

+0

Si incluye DDL y datos de muestra la próxima vez, tal vez gane. :-) –

+0

¿Qué? ¿Dónde está la instrucción 'CREATE DATABASE' ?! Si te fijas lo suficientemente cerca, hay un fregadero en esta respuesta =) –

Cuestiones relacionadas