Ответ 1
Select *
FROM test_table
WHERE user_id = value
AND date_added = (select max(date_added)
from test_table
where user_id = value)
Здравствуйте, у меня есть таблица со столбцами:
* используя 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)
Спасибо
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
Предполагая, что ваши функции RDBMS знают окна, а 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