回答

收藏

PostgreSQL-选择条件成立的distinct(column1,column2)

技术问答 技术问答 108 人阅读 | 0 人回复 | 2023-09-12

我有下表和一些示例记录:9 R' Z7 ]  c( D" ^: k
        id  | attr1_id | attr2_id |      user_id      | rating_id |------ ---------- ---------- ------------------- ----------- 1     |       18888                 1888|      201 | user_1@domain.com |          3 3   3                      | 2    |       1933                      |      201 | user_2@domain.com |      | 3    |       1933                      |      201 | user_2@domain.com |     | 4    |        1944                   |      201 | user_2@domain.com |     | 5    |        1944                   |      201 | user_1@domain.com |     | 6    |        1922                    |      201 | user_2@domain.com |     |的组合(attr1_id,attr2_id,user_id)的UNIQUE,这意味着每个用户只能创建一对特定的属性id记录。
2 u& z8 |1 Q2 \# u& g  n我的目标是选择(attr1_id,attr2_id)的所有不同组合rating_id =但是,只选择和的每一个组合,attr1_id并且仅选择attr2_id而且只存在于不存在(由其他用户使用)rating_id >1并引用相同attr1_id在任何其他行的情况下。attr2_id。请注意,组合attr1_id和attr2_id可以左右切换,所以给这两个记录:, t3 Y3 Y* K0 r0 R
        id  | attr1_id | attr2_id |      user_id       | rating_id | override_comment------ ---------- ---------- -------------------- ----------- ------------------  20  |     5 5        5           5               5          5         5                                                     5 5        5                                                        5 5 5 5 5 5 5 5 5           5 5      5                                                       5 5 5        5                    5                                                   5                              5                                      5                                             5           5                                                 5           5                                           |        2                   2       | user_1@domain.com  |          3 3   3                      |------ ---------- ---------- -------------------- ----------- ------------------  21  |        2                   2       |     5 5        5           5               5          5         5                                                     5 5        5                                                        5 5 5 5 5 5 5 5 5           5 5      5                                                       5 5 5        5                    5                                                   5                              5                                      5                                             5           5                                                 5           5                                           | user_2@domain.com  |     |由于这些行指的是相同的组合,因此不应计算任何行,attr_ids其中一个有rating_id > 1。
1 U% C3 K0 q- O( v但如果有这两行:$ x$ z# y8 P/ \( f$ R7 Y
        id  | attr1_id | attr2_id |      user_id       | rating_id | override_comment------ ---------- ---------- -------------------- ----------- ------------------  20  |     5 5        5           5               5          5         5                                                     5 5        5                                                        5 5 5 5 5 5 5 5 5           5 5      5                                                       5 5 5        5                    5                                                   5                              5                                      5                                             5           5                                                 5           5                                           |        2                   2       | user_1@domain.com  |     |------ ---------- ---------- -------------------- ----------- ------------------  21  |        2                   2       |     5 5        5           5               5          5         5                                                     5 5        5                                                        5 5 5 5 5 5 5 5 5           5 5      5                                                       5 5 5        5                    5                                                   5                              5                                      5                                             5           5                                                 5           5                                           | user_2@domain.com  |     |------ ---------- ---------- -------------------- ----------- ------------------  22  |        2                   2       |     5 5        5           5               5          5         5                                                     5 5        5                                                        5 5 5 5 5 5 5 5 5           5 5      5                                                       5 5 5        5                    5                                                   5                              5                                      5                                             5           5                                                 5           5                                           | user_3@domain.com  |     |所有的行只能算作一个,因为它们都有相同的组合attr1_id,并attr2_id和所有有rating_id = 1。
2 }- L) I; m" f  Y* d$ W另外,我将省略一些联接表列的联接和过滤,但是我还是想提到它。
8 q2 y6 ]3 M& t) D! D# V1 n" ~- FSQL Fiddle现在对我不起作用,但我已经1 v$ A% N7 w6 S% s' v8 w
一些示例数据从兼容性表中上传。

2 s1 |* t3 Y9 C& Z6 @1 x. S3 p. R% z到目前为止,我的查询是这样的:
+ r" q  Y1 Y0 b7 y: e3 zSELECT distinct(a1,a二、       a       a2FROM  ( SELECT c.*,          least(attr1_id,attr2_id) AS a           greatest(attr1_id,attr2_id) AS a2   FROM compatibility c   JOIN attribute a ON c.attr1_id = a.id   JOIN PARAMETER pa ON a.parameter_id = pa.id   JOIN problem p ON pa.problem_id = p.id   WHERE p.id = 1   GROUP BY             2 HAVING NOT bool_or(rating_id > 1)) s;样本中共有144个评分。每个用户创建了7个独特的rating_id >1这14个评分中,有2个引用了同一组(attr1_id,attr2_id)。所以我要找的号码会是(77-12) =但这里的结果似乎是77-2 = 75。因此,只有两个属性相同ID行才的等级被丢弃。/ ]" A6 t( n8 ^6 `; Q1 E( H3 c
我还想指出我之前关于这个问题的问题,让我重新开始一个问题。; {/ l* t8 k' Q: t2 C
                                                                0 f& U, ?0 a4 N6 q, x+ Q7 Z" v  w
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则