SQL 如何选择最近的日期项

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4090789/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-01 08:08:08  来源:igfitidea点击:

SQL How to Select the most recent date item

sqloracleselectdate

提问by Matt

Hello I have a table with columns:

您好,我有一个带列的表:

*using oracle

*使用oracle

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

I want to know how i can get the most recently added document for a given user.

我想知道如何为给定用户获取最近添加的文档。

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

Thanks

谢谢

回答by sh_kamalh

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

回答by gbn

Not sure of exact syntax (you use varchar2 type which means not SQL Server hence TOP) but you can use the LIMIT keyword for MySQL:

不确定确切的语法(您使用 varchar2 类型,这意味着不是 SQL Server 因此是 TOP),但您可以对 MySQL 使用 LIMIT 关键字:

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

Or rownum in Oracle

或者 Oracle 中的 rownum

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

If DB2, I'm not sure whether it's TOP, LIMIT or rownum...

如果是 DB2,我不确定它是 TOP、LIMIT 还是 rownum...

回答by Noel Abrahams

With SQL Server try:

使用 SQL Server 尝试:

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

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

回答by Vincent Savard

Assuming your RDBMS know window functions and CTE and USER_ID is the patient's id:

假设您的 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;

I assumed you wanted to sort by DOCUMENT_DATE, you can easily change that if wanted. If your RDBMS doesn't know window functions, you'll have to do a join :

我假设您想按 DOCUMENT_DATE 排序,如果需要,您可以轻松更改它。如果您的 RDBMS 不知道窗口函数,则必须执行 join :

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;

It would be good to tell us what your RDBMS is though. And this query selects the most recent date for every patient, you can add a condition for a given patient.

不过,最好告诉我们您的 RDBMS 是什么。此查询为每个患者选择最近的日期,您可以为给定患者添加条件。

回答by Jeffrey Kemp

You haven't specified what the query should return if more than one document is added at the same time, so this query assumes you want all of them returned:

如果同时添加多个文档,您尚未指定查询应返回的内容,因此此查询假定您希望返回所有文档:

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;

This query will only make one pass through the data.

此查询只会使数据通过一次。

回答by pavanred

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