首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对应行的聚合函数

对应行的聚合函数
EN

Stack Overflow用户
提问于 2018-11-06 16:18:57
回答 1查看 24关注 0票数 0

下面的表使用idts的组合主键来实现历史性:

代码语言:javascript
运行
复制
create table "author" (
  "id"     bigint     not null,
  "ts"     timestamp  not null default now(),
  "login"  text       unique not null,
  primary key ("id", "ts")
);

现在我只对最新的login值感兴趣。为此,我按id分组

代码语言:javascript
运行
复制
select "id", max("ts"), "login" from "author" group by "id";

但是这会引发一个错误:应该在聚合函数中使用login

idmax("ts")唯一地标识一行,因为tupple (id,ts)是主键。我需要login,它与idmax("ts")标识的行匹配。

我可以编写一个子选择来查找login

代码语言:javascript
运行
复制
select ao."id", max(ao."ts"), 
       (select ai.login from "author" ai
        where ao."id" = ai."id" and max(ao."ts") = ai.ts)
from "author" ao
group by "id";

这是工作的,但它是相当嘈杂和不太聪明,因为它搜索整个表,虽然搜索组将是足够的。

是否存在聚合函数,它避免了子选择,并给出了属于idmax("ts")的剩余的max("ts")

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-06 16:25:47

您必须标识正确的键才能从表中获得您喜欢的值。

正确的关键是:

代码语言:javascript
运行
复制
 select "id", max("ts") from "author" group by "id";

并使用它获取您想要的登录:

代码语言:javascript
运行
复制
 select a1."id", a1.ts, a1.login
 from "author" a1
      inner join (select "id", max("ts") maxts, "login" from "author" group by "id") a2
      ON a1.id = a2.id AND a1.ts = a2.maxts;

另一种方法是使用窗口函数:

代码语言:javascript
运行
复制
 SELECT "id", "ts", login
 FROM (
      select "id", "ts", CASE WHEN "ts" = max("ts") OVER (PARTITION BY "id") THEN 1 ELSE 0 END as isMax, "login" from "author" group by "id"
       ) dt
 WHERE isMax = 1

还有其他几种方法可以剥去这只猫的皮,但这基本上就是要点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53175831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档