获取Oracle中最新日期的记录

时间:2013-11-06 09:59:10

标签: sql oracle

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

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函数或任何其他方式来获取最新日期而无需创建子查询(这与主查询几乎相同)。

非常感谢

2 个答案:

答案 0 :(得分:2)

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

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

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是一个数字

答案 1 :(得分:0)

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.nid的行号创建单独的分区。