SQL如何选择最近日期的项目

37

你好,我有一个包含如下列的表:

*使用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)

谢谢

6个回答

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

如果您拥有许多用户,这是否会导致每个用户都有一个单独的选择查询,这可能会影响性能并超时? - falsePockets

17

不确定具体的语法(你使用的是varchar2类型,这意味着不是SQL Server,因此没有TOP),但你可以在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...


9

使用SQL Server,请尝试以下操作:

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

4

您没有指定如果同时添加多个文档,查询应该返回什么,因此此查询假定您希望全部返回:

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;

这个查询只会对数据进行一次扫描。

3
假设您的关系型数据库支持窗口函数和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排序,如果需要,您可以轻松更改它。如果您的关系型数据库管理系统不支持窗口函数,则必须执行连接操作:

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
Select Top 1* FROM test_table WHERE user_id = value order by Date_Added Desc

如果您发布代码或XML,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码”按钮(101 010)以使其格式化和语法高亮! - marc_s
糟糕..我可能错过了格式,我没有注意到。无论如何还是谢谢。 - pavanred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接