Sql语句问题

时间:2011-05-10 19:25:35

标签: sql select distinct

我有一个表,其中包含日志并具有以下方案:

USER | DATE | LOG
x      x      x
...

现在,我想进行 ONE 查询以检索每个(USER, DATE)对,其中DATE是此用户的最新信息。

我在考虑像(伪):

这样的东西
SELECT ... FROM (TABLE) ORDERED BY DATE, DISTINCT BY USER

但我不确定这是否会奏效。

DISTINCT在此查询中采用第一个可能的日期是否正确,从而产生所需的结果?或者DISTINCT查询中元素的顺序是未定义的?


如果是,我应该如何解决这个问题(这是我无法添加新表的情况,例如users,例如,缓存那里的最新日期)

4 个答案:

答案 0 :(得分:1)

  

现在,我想要进行一次查询   检索每个(USER,DATE)对,   DATE是最新的   用户。

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

您可能想要添加ORDER BY user

由于 user date 都是大多数SQL dbms的保留字,因此更有可能运行。

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

答案 1 :(得分: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;

答案 2 :(得分: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)

答案 3 :(得分:0)

最简单的解决方案是

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

这就是您所要求的 - 但如果您在查询中添加“log”,则需要使用子查询。