2011-05-10 97 views
1

我有一个表,其中包含日志,并具有以下方案:Sql语句的问题

USER | DATE | LOG 
x  x  x 
... 

现在,我要让ONE查询检索每个(USER, DATE)对,其中DATE是最新的为这个用户。

我在思考着什么样(伪):

SELECT ... FROM (TABLE) ORDERED BY DATE, DISTINCT BY USER 

但我不知道这是要去工作。

是否正确DISTINCT会采取第一次可能日期在此查询,因此产生所需的结果?或者DISTINCT查询中元素的顺序是不确定的?


如果是的话,我应该怎么解决这个问题(这是我不能添加新表的情况下,如users,例如,缓存最新的日期还有)

回答

1

现在,我想打一个查询 检索每一个(USER,DATE)对,其中 日期是最新的这个 用户。

select user, max(date) 
from yourtable 
group by user 

您可能要添加ORDER BY user

由于用户日期是大多数SQL DBMS的保留字,因此更有可能运行。

select "user", max("date") 
from "yourtable" 
group by "user"; 
0

它自己的DISTINCT不会完全做你想做的,因为你想要最大的日期PER USER,你需要做一个子查询。查询中的顺序将确保您获得最大日期。

SELECT DISTINCT USER 
     , DATE 
     , LOG 
     FROM TABLE AS T1 
    WHERE DATE = (SELECT TOP 1 DATE 
        FROM TABLE AS T2 
        WHERE T2.USER = T1.USER 
       ORDER BY DATE DESC) 
+0

对不起做到这一点,忘了我的子查询做顶1。 – 2011-05-10 19:42:35

0

简单的解决办法是

select user, max(date) 
from tableName 
group by user 

这确实你问什么 - 但如果你添加“日志”的查询,则需要使用子查询。

1

如果你的数据库支持窗口,你可以用

SELECT user, date, log FROM 
(SELECT user, date, log, row_number() 
    OVER (PARTITION BY user ORDER BY date DESC) AS rn) FROM table_name) AS subq 
WHERE rn=1;