2010-11-03 9 views
24

Bonjour J'ai une table avec des colonnes:SQL Comment sélectionner la date la plus récente article

* en utilisant Oracle

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

Je veux savoir comment je peux obtenir le document le plus récemment ajouté une donnée utilisateur.

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

Merci

+1

Qu'est-ce RDBMS s'il vous plaît? – gbn

+0

Désolé d'utiliser oracle, j'ai édité mon message – Matt

Répondre

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 vous codez du code ou du code XML, ** s'il vous plaît ** surlignez ces lignes dans l'éditeur de texte et cliquez sur le bouton "code" (101 010) et la syntaxe le mettre en évidence! –

+0

oups .. Je dois avoir manqué le formatage, je n'ai pas remarqué. Merci quand même. – pavanred

12

Je ne sais pas la syntaxe exacte (vous utilisez le type varchar2 qui ne signifie pas SQL Server donc TOP), mais vous pouvez utiliser le mot-clé LIMIT pour MySQL:

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

Ou rownum dans Oracle

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

Si DB2, je ne suis pas sûr que ce soit vers le haut, LIMIT ou rownum ...

5

Avec essayer SQL Server:

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

2

En supposant que votre SGBDR connaître les fonctions de fenêtre et CTE et ID_UTILISATEUR du patient 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; 

Je supposais que vous vouliez trier par DOCUMENT_DATE, vous pouvez facilement changer cela si vous le souhaitez. Si votre SGBDR ne connaît pas les fonctions de la fenêtre, vous devrez faire une jointure:

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; 

Il serait bon de nous dire ce que votre SGBDR est bien. Et cette requête sélectionne la date la plus récente pour chaque patient, vous pouvez ajouter une condition pour un patient donné.

+0

Désolé, j'utilise Oracle – Matt

+0

Oracle sait fonctions de fenêtre et CTE ... –

+0

Impressionnant SQL standard, merci – Adam

2

Vous n'avez pas spécifié ce que la requête doit retourner si plus d'un document est ajouté en même temps, donc cette requête suppose que vous voulez tous retournés:

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; 

Cette requête seulement faire un passage à travers les données.