2010-11-03 211 views
24

Ciao Ho una tabella con le colonne:SQL Come selezionare la voce data più recente

* utilizza Oracle

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

Vorrei sapere come posso ottenere il documento più recentemente aggiunto per una data utente.

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

Grazie

+1

Che tipo di RDBMS? – gbn

+0

Scusa se sto usando oracle, ho modificato il mio post – Matt

risposta

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

Se inserisci codice o XML, ** per favore ** evidenzia quelle righe nell'editor di testo e fai clic sul pulsante "codice" (101 010) sulla barra degli strumenti dell'editor per formattarlo in modo appropriato e la sintassi lo evidenzia! –

+0

oops .. Devo aver perso la formattazione, non l'ho notato. Grazie comunque. – pavanred

12

Non sono sicuro di sintassi esatta (si utilizza tipo varchar2 il che significa che non SQL Server quindi TOP), ma è possibile utilizzare la parola chiave LIMIT per MySQL:

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

O Rownum in Oracle

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

Se DB2, non sono sicuro che si tratti di TOP, limitare o rownum ...

5

Con prova di SQL Server:

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

2

Assumendo che il RDBMS sanno funzioni finestra e CTE e USER_ID è il paziente id:

Supponevo che volessi ordinare per DOCUMENT_DATE, puoi facilmente modificarlo se lo desideri. Se il RDBMS non conosce funzioni finestra, dovrete fare un join:

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; 

Sarebbe bene a dirci che cosa il vostro RDBMS è però. E questa query seleziona la data più recente per ogni paziente, è possibile aggiungere una condizione per un determinato paziente.

+0

Siamo spiacenti, sto usando Oracle – Matt

+0

Oracle conosce le funzioni della finestra e CTE ... –

+0

SQL standard impressionante, grazie – Adam

2

Non è stato specificato che cosa la query deve restituire se si aggiunge più di un documento, allo stesso tempo, in modo da questa query presuppone che si desidera tutti loro sono tornati:

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; 

Questa query solo fare un passaggio attraverso i dati.

Problemi correlati