SQL как выбрать самый последний элемент даты

Привет у меня есть таблица со столбцами:

* использование oracle

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

Я хочу знать, как я могу получить последний добавленный документ для данного пользователя.

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

спасибо

6 ответов


Select * 
FROM test_table 
WHERE user_id = value 
AND date_added = (select max(date_added) 
   from test_table 
   where user_id = value)

не уверен в точном синтаксисе (вы используете тип varchar2, который означает не SQL Server, следовательно, TOP), но вы можете использовать ключевое слово LIMIT для MySQL:

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

или rownum в Oracle

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

Если DB2, я не уверен, что это TOP, LIMIT или rownum...


с SQL Server попробуйте:

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


предполагая, что ваши СУБД знают оконные функции, а CTE и USER_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;

я предположил, что вы хотите сортировать по DOCUMENT_DATE, вы можете легко изменить это, если хотите. Если ваша СУБД не знает оконных функций, вам придется выполнить соединение:

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;

было бы хорошо рассказать нам, что такое ваша РСУБД. И этот запрос выбирает самую последнюю дату для каждого пациента, Вы можете добавить условие для данного пациента.


вы не указали, что должен возвращать запрос, если одновременно добавляется более одного документа, поэтому этот запрос предполагает, что вы хотите, чтобы все они были возвращены:

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;

этот запрос сделает только один проход через данные.


Select Top 1* FROM test_table WHERE user_id = value order by Date_Added Desc