我需要找到对帖子执行操作的最后一个人的电子邮件。数据库结构有点复杂,因为有几个原因并不重要。
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函数或任何其他方式来获取最新日期而无需创建子查询(这与主查询几乎相同)。
非常感谢
答案 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
的行号创建单独的分区。