こんにちは、列のあるテーブルがあります:
* 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)
正確な構文は定かではありません(SQL Serverではないため、TOPを意味するvarchar2型を使用します)が、MySQLにはLIMITキーワードを使用できます。
Select * FROM test_table WHERE user_id = value
ORDER BY DATE_ADDED DESC LIMIT 1
またはOracleのrownum
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
同時に複数のドキュメントが追加された場合にクエリが返すものを指定していないため、このクエリでは、すべてのドキュメントが返されることを前提としています。
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;
このクエリは、データを1回だけ通過します。
RDBMSがウィンドウ機能とCTEおよびUSER_IDを知っていると仮定すると、患者の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で並べ替えたいと思っていましたが、必要に応じて簡単に変更できます。 RDBMSがウィンドウ関数を知らない場合は、結合を行う必要があります。
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;
ただし、RDBMSが何であるかを教えてください。また、このクエリはすべての患者の最新の日付を選択します。特定の患者の条件を追加できます。
Select Top 1* FROM test_table WHERE user_id = value order by Date_Added Desc