2010-11-03 77 views
24

你好,我有列的表格: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) 

感謝

+1

什麼RDBMS請? – gbn 2010-11-03 19:32:11

+0

對不起,我正在使用oracle,我編輯了我的文章 – Matt 2010-11-03 19:58:37

回答

48
Select * 
FROM test_table 
WHERE user_id = value 
AND date_added = (select max(date_added) 
    from test_table 
    where user_id = value)
0
Select Top 1* FROM test_table WHERE user_id = value order by Date_Added Desc 
+0

如果您發佈代碼或XML,請**在文本編輯器中高亮顯示這些行,然後單擊編輯器工具欄上的「代碼」按鈕(101 010)並語法突出顯示它! – 2010-11-03 19:31:33

+0

哎呀..我必須錯過格式化,我沒有注意到。不管怎麼說,還是要謝謝你。 – pavanred 2010-11-03 20:10:33

12

不知道確切的語法(使用VARCHAR2類型,這意味着沒有SQL服務器,因此TOP),但你可以使用LIMIT關鍵字爲MySQL:

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,限制或ROWNUM ...

5

有了SQL Server嘗試:

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

2

假設你的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排序,如果需要,你可以很容易地改變。如果您的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是什麼,但。並且此查詢爲每位患者選擇最近的日期,您可以爲給定的患者添加條件。

+0

對不起,我正在使用oracle – Matt 2010-11-03 20:00:59

+0

Oracle知道窗口函數和CTE ... – 2010-11-03 21:33:34

+0

令人敬畏的標準SQL,謝謝 – Adam 2015-10-23 14:44:06

2

您還沒有指定查詢應該返回什麼,如果超過一個文件在同一時間增加,所以這個查詢假設你希望所有的人都回來:

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; 

這個查詢只有一次通過數據。