gpt4 book ai didi

sql - 从一对多表中获取多个最大值

转载 作者:行者123 更新时间:2023-12-02 06:53:15 24 4
gpt4 key购买 nike

我有两个表,我想从一对多表中获取 MAX(date)。如果没有值,它应该是 NULL。我知道如何通过子查询来做到这一点的唯一方法,但如果有 ~20 种不同的类型,那么 20 个子查询听起来效率不够。有没有更好的方法呢?

Table A:UserId    | Name1         | John2         | JaneTable B:UserId   | Type    | Date1        | A       | 2015-01-011        | A       | 2015-12-311        | B       | 2015-01-011        | B       | 2015-12-312        | B       | 2015-06-061        | C       | 2015-01-012        | C       | 2015-09-09Result:UserId | Type A date | Type B date | Type C date1      | 2015-12-31  | 2015-12-31  | NULL2      | NULL        | 2015-06-06  | 2015-09-09
Current solution: SELECT UserId,        (SELECT MAX(Date) FROM B WHERE Type = 'A' AND B.UserId= A.UserId),        (SELECT MAX(Date) FROM B WHERE Type = 'B' AND B.UserId= A.UserId),        (SELECT MAX(Date) FROM B WHERE Type = 'C' AND B.UserId= A.UserId        AND Date > (SELECT MAX(Date) FROM B WHERE Type = 'B' AND B.UserId =   A.UserId))    FROM A

感谢您的所有快速回答!他们工作得很好。我稍微修改了我的问题,因为我注意到我需要在某些类型上添加一些条件。例如。类型 C 应该只在它比类型 B 大时出现。

最佳答案

要获得预期结果,您甚至不需要join,只需执行group by 并使用case 表达式对条件进行聚合:

select userid,
max(case when type = 'A' then date end) Adate,
max(case when type = 'B' then date end) Bdate
from tableB
group by userid

如果你还想要用户名,你可以用上面的查询加入tableA:

select a.name, b.Adate, b.Bdate
from tableA a
join (select userid,
max(case when type = 'A' then date end) Adate,
max(case when type = 'B' then date end) Bdate
from tableB
group by userid) b
on a.userid = b.userid

但是,如果类型的数量未知,我也会按列类型分组。即不同行的返回类型。

select a.name, b.type, b.date
from tableA a
left join (select userid, type, max(date) date,
from tableB
group by userid, type) b
on a.userid = b.userid

关于sql - 从一对多表中获取多个最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37741759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com