回答

收藏

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

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

我有下表和一些示例记录:
* j! s2 d! l3 U6 ^        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记录。
1 e! _  B) s; Z$ C' e% |. A  p" q我的目标是选择(attr1_id,attr2_id)的所有不同组合rating_id =但是,只选择和的每一个组合,attr1_id并且仅选择attr2_id而且只存在于不存在(由其他用户使用)rating_id >1并引用相同attr1_id在任何其他行的情况下。attr2_id。请注意,组合attr1_id和attr2_id可以左右切换,所以给这两个记录:7 F1 `# p# G. w; z5 d& C
        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。
, e# t" [/ P& {& |: b但如果有这两行:
$ p; I- {' r* Y3 D# Q        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。- Y0 F# ]) h; V1 g
另外,我将省略一些联接表列的联接和过滤,但是我还是想提到它。, F2 v6 a, N6 j
SQL Fiddle现在对我不起作用,但我已经
( K& T$ r7 B/ {% G$ x8 P一些示例数据从兼容性表中上传。
* x2 b/ f$ x$ W! y$ y- ]- w7 z
到目前为止,我的查询是这样的:
+ C3 }5 K  |5 E1 I. Z3 z7 {  L0 Y* |SELECT 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行才的等级被丢弃。
% e9 s7 H/ g/ I% S* v我还想指出我之前关于这个问题的问题,让我重新开始一个问题。6 b$ Q$ y! Z2 i# J
                                                               
6 p" l7 ~5 d% X* C$ y( l9 N+ L0 [    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则