0

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

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

非常感谢

4

2 回答 2

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在问题中使用 a 。但是,如果您需要例如每个地址的最大日期,那么您可以使用

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

于 2013-11-06T10:03:30.980 回答
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的分区。

于 2013-11-06T10:10:23.610 回答