SQL Comment sélectionner l'élément de date le plus récent

Bonjour j'ai une table avec des colonnes:

*utilisation d'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 plus récemment ajouté document pour un utilisateur donné.

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

Merci

25
demandé sur Matt 2010-11-03 22:20:24

6 réponses

Select * 
FROM test_table 
WHERE user_id = value 
AND date_added = (select max(date_added) 
   from test_table 
   where user_id = value)
49
répondu sh_kamalh 2010-11-03 19:43:41

Pas sûr de la syntaxe exacte (vous utilisez le type varchar2 qui 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 TOP, LIMIT ou rownum...

12
répondu gbn 2010-11-03 19:27:43

Avec SQL Server essayez:

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

6
répondu Noel Abrahams 2010-11-03 19:22:48

En supposant que votre SGBDR connaisse les fonctions de la fenêtre et que CTE et USER_ID sont l'id du patient:

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;

J'ai supposé 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 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 cependant. Et cette requête sélectionne la date la plus récente pour chaque patient, vous pouvez ajouter une condition pour un patient donné.

2
répondu Vincent Savard 2010-11-03 19:22:52

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

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 ne fera qu'un seul passage à travers les données.

2
répondu Jeffrey Kemp 2010-11-04 00:36:57
Select Top 1* FROM test_table WHERE user_id = value order by Date_Added Desc
0
répondu pavanred 2010-11-03 20:08:04