【问题标题】:Get records with the newest date in Oracle获取Oracle中最新日期的记录
【发布时间】:2013-11-06 09:59:10
【问题描述】:

我需要找到最后一个对帖子执行操作的人的电子邮件。数据库结构有点复杂,有几个原因对本案并不重要。

SELECT u.address 
FROM text t 
JOIN post p ON (p.pid=t.pid) 
JOIN node n ON (n.nid=p.nid) 
JOIN user u ON (t.login=u.login) 
WHERE n.nid='123456' 
AND p.created IN (
   SELECT max(p.created) 
   FROM text t 
   JOIN post p ON (p.pid=t.pid) 
   JOIN node n ON (n.nid=p.nid) 
   WHERE n.nid='123456');

我想知道是否有办法使用 max 函数或任何其他方式来获取最新日期,而无需进行子查询(这与主查询几乎相同)。

非常感谢

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以使用窗口函数(也称为“分析”函数)来计算最大日期。

    然后您可以选择创建日期等于最大值的所有行。日期。

    select address
    from (
      SELECT u.address,
             p.created,
             max(p.created) over () as max_date
      FROM text t 
        JOIN post p ON (p.pid=t.pid) 
        JOIN node n ON (n.nid=p.nid) 
        JOIN user u ON (t.login=u.login) 
      WHERE n.nid='123456' 
    ) t
    where created = max_date;
    

    over() 子句为空,因为您没有在问题中使用GROUP BY。但是如果你需要例如每个地址的最大日期,那么你可以使用

    max(p.created) over (partition by t.adress) as max_date
    

    partition by 的工作方式类似于 group by

    您还可以将该查询扩展到多个n.id。因为您必须将其包含在分区中:

    max(p.created) over (partition by n.id, ....) as max_date
    

    顺便说一句:如果n.id 是数字列,则不应将其与字符串文字进行比较。 '123456' 是字符串,123456 是数字

    【讨论】:

    • 这与使用子查询计算 max(date) 的更经典方法相比性能如何?
    • @Rene:根据我的经验要好得多,因为只执行一个查询而不是两个查询(主查询和子查询)。但是需要查看执行计划才能 100% 确定。
    • 下次有情况再试试。
    • 谢谢,效果很好,你解释得很好。感谢您对 n.nid 的建议,但它实际上可以包含字母。无论如何,我无权更改数据库结构...
    【解决方案2】:
    SELECT address
    FROM (
    SELECT u.address,
           row_number() OVER (PARTITION BY n.nid ORDER BY p.created DESC) AS rn
      FROM text t  JOIN post p ON (p.pid=t.pid) 
           JOIN node n ON (n.nid=p.nid) 
           JOIN user u ON (t.login=u.login) 
     WHERE n.nid='123456' 
    )
    WHERE rn = 1;
    

    ROW_NUMBER 函数按 p.created 的降序对行进行编号,PARTITION BY n.nid 为单独的 n.nids 的行号创建单独的分区。

    【讨论】:

    • The partition by n.id is not really needed here as only a single one is selected - but it will be necessary when more than one id is selected.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    • 2020-12-19
    • 2015-12-06
    • 2021-11-19
    相关资源
    最近更新 更多