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
解决方案: |
|
|
|
|
|