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