2010-11-03 14 views
24

Hola tengo una tabla con columnas:SQL Cómo seleccionar el artículo de la fecha más reciente

* utilizando Oracle

ID     NUMBER 
USER_ID   NUMBER 
DATE_ADDED   DATE 
DATE_VIEWED  DATE 
DOCUMENT_ID  VARCHAR2 
URL    VARCHAR2 
DOCUMENT_TITLE  VARCHAR2 
DOCUMENT_DATE  DATE 

quiero saber cómo puedo obtener el documento más recientemente añadido para un determinado usuario.

Select * FROM test_table WHERE user_id = value AND (do something with date_added column) 

Gracias

+1

¿Qué RDBMS por favor? – gbn

+0

Lo siento estoy usando Oracle, edité mi publicación – Matt

Respuesta

48
Select * 
FROM test_table 
WHERE user_id = value 
AND date_added = (select max(date_added) 
    from test_table 
    where user_id = value)
0
Select Top 1* FROM test_table WHERE user_id = value order by Date_Added Desc 
+0

Si publica código o XML, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "código" (101 010) en la barra de herramientas del editor para formatear y la sintaxis lo resalta! –

+0

¡Uy! Debo haber perdido el formato, no me di cuenta. Gracias de cualquier manera. – pavanred

12

No está seguro de la sintaxis exacta (se utiliza el tipo VARCHAR2 lo que significa que no SQL Server, por tanto, TOP) pero se puede utilizar la palabra clave LIMIT de MySQL:

Select * FROM test_table WHERE user_id = value 
    ORDER BY DATE_ADDED DESC LIMIT 1 

O rownum en Oracle

SELECT * FROM 
    (Select rownum as rnum, * FROM test_table WHERE user_id = value ORDER BY DATE_ADDED DESC) 
WHERE rnum = 1 

Si DB2, no estoy seguro de si se trata de TOP, limitar o rownum ...

5

Con intento de SQL Server:

SELECT TOP 1 * FROM dbo.youTable WHERE user_id = 'userid' ORDER BY date_added desc

2

Asumiendo que su RDBMS saben funciones de la ventana y el CTE y USER_ID es la del paciente id:

WITH TT AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY USER_ID ORDER BY DOCUMENT_DATE DESC) AS N 
    FROM test_table 
) 
SELECT * 
FROM TT 
WHERE N = 1; 

Asumí que quería ordenar antes del DOCUMENT_DATE, puede cambiarlo fácilmente si lo desea. Si su RDBMS no sabe funciones de la ventana, tendrá que hacer una combinación:

SELECT * 
FROM test_table T1 
INNER JOIN (SELECT USER_ID, MAX(DOCUMENT_DATE) AS maxDate 
      FROM test_table 
      GROUP BY USER_ID) T2 
    ON T1.USER_ID = T2.USER_ID 
     AND T1.DOCUMENT_DATE = T2.maxDate; 

Sería bueno que nos diga lo que su RDBMS es sin embargo. Y esta consulta selecciona la fecha más reciente para cada paciente, puede agregar una condición para un paciente determinado.

+0

Lo siento, estoy usando Oracle – Matt

+0

Oracle sabe funciones de ventana y CTE ... –

+0

SQL estándar impresionante, gracias – Adam

2

No ha especificado lo que la consulta debe devolver si se añade más de un documento al mismo tiempo, por lo que esta consulta supone que desea todos ellos regresaron:

SELECT t.ID, 
     t.USER_ID, 
     t.DATE_ADDED, 
     t.DATE_VIEWED, 
     t.DOCUMENT_ID, 
     t.URL, 
     t.DOCUMENT_TITLE, 
     t.DOCUMENT_DATE 
FROM (
    SELECT test_table.*, 
     RANK() 
     OVER (ORDER BY DOCUMENT_DATE DESC) AS the_rank 
    FROM test_table 
    WHERE user_id = value 
) 
WHERE the_rank = 1; 

esta consulta solo haga una pasada a través de los datos.

Cuestiones relacionadas