【问题标题】:Sql statement questionsql语句问题
【发布时间】:2011-05-10 19:25:34
【问题描述】:

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

USER | DATE | LOG
x      x      x
...

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

我正在考虑类似 (伪):

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

但我不确定这是否可行。

DISTINCT 在此查询中采用 first possible 日期是否正确,从而产生所需的结果?还是DISTINCT查询中的元素顺序未定义?


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

【问题讨论】:

    标签: sql select distinct


    【解决方案1】:

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

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

    您可能想要添加ORDER BY user

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

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

    【讨论】:

      【解决方案2】:

      如果你的数据库支持窗口化,你可以这样做

      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;
      

      【讨论】:

        【解决方案3】:

        最简单的解决方案是

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

        这可以满足您的要求 - 但如果您在查询中添加“日志”,则需要使用子查询。

        【讨论】:

          【解决方案4】:

          DISTINCT 本身并不能完全满足您的需求,因为您想要 PER USER 的最大日期,您需要执行子查询。查询中的 order by 将确保您获得最大日期。

              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)
          

          【讨论】:

          • 对不起,忘记在我的子查询中做前 1。
          猜你喜欢
          • 2010-09-25
          • 2015-10-15
          • 2010-10-11
          • 2011-04-23
          • 2018-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-10
          相关资源
          最近更新 更多