简体   繁体   English

SQL - Select 一对多关系的最大和最小行

[英]SQL - Select max and min rows from one-to-many relationship

I have three tables connected in a following one-to-many relationships: A+B -> one-to-many, B+C -> one-to-many.我有三个表以以下一对多关系连接:A+B -> 一对多,B+C -> 一对多。 For every entry AI want to get all its B entries and two of their connected C entries representing max(C.created) and min(C.created)对于每个条目,AI 都希望获得其所有 B 条目以及它们连接的两个 C 条目,表示max(C.created)min(C.created)

A: A:

+-----+
| id  | 
+-----+
|0.   |
+-----+

B:乙:

+---------------+
| id   | A_id  |
+---------------+
|1.    | 0.    |
|2.    | 0.    |
+---------------+

C: C:

+--------------------------+
| id  | B_id   | created   |
+--------------------------+
|3    | 1      | 2010
|4    | 1      | 2015
|5    | 1      | 2020
|6    | 2      | 2011
|7    | 2      | 2015
|8    | 2      | 2014
+--------------------------+

result:结果:

+--------------------------+
| A_id  | C_id   | created|
+--------------------------+
|0       | 3      | 2010
|0       | 5      | 2020
|0       | 6      | 2011
|0       | 7      | 2015
+--------------------------+

This is how my failed attempts looks like, I just cannot make it work as I'd like to:这就是我失败的尝试的样子,我只是不能让它像我想的那样工作:

select A.id, C.id, C.created
from A
join B on (A.id = B.A_id)
join (select *
      from C
            where C.created = (select min(created) from C) or
                  C.created = (select max(created) from C)
) as foo
on B.id = foo.B_id

Your data looks like c has a link to b , not a .您的数据看起来像c具有指向b的链接,而不是a Assuming this is the case, you can use window functions:假设是这种情况,您可以使用 window 函数:

select a.*, b.*, c.*
from a join
     b
     on b.a_id = a.id join
     (select c.*,
             row_number() over (partition by c.b_id order by c.created) as seqnum_asc,
             row_number() over (partition by c.b_id order by c.created desc) as seqnum_desc
      from c
     ) c
     on b.id = c.b_id and
        1 in (seqnum_asc, seqnum_desc);

your query should be你的查询应该是

select A.id, foo.id, foo.created
from A
join B on (A.id = B.A_id)
join (select *
      from C
            where C.created = (select min(created) from C as C1 where C.B_id=C1.B_id) or
                  C.created = (select max(created) from C as C1 where C.B_id=C1.B_id)
) as foo
on B.id = foo.B_id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM