SQL Как выбрать самый последний элемент даты - PullRequest
28 голосов
/ 03 ноября 2010

Здравствуйте. У меня есть таблица со столбцами:

* с использованием оракула

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 ]

54 голосов
/ 03 ноября 2010
Select * 
FROM test_table 
WHERE user_id = value 
AND date_added = (select max(date_added) 
   from test_table 
   where user_id = value)
13 голосов
/ 03 ноября 2010

Не уверен в точном синтаксисе (вы используете тип 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 ...

7 голосов
/ 03 ноября 2010

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

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

2 голосов
/ 04 ноября 2010

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

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;

Этот запрос будет выполнять толькоодин проход через данные.

2 голосов
/ 03 ноября 2010

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

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

0 голосов
/ 03 ноября 2010
Select Top 1* FROM test_table WHERE user_id = value order by Date_Added Desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...