如何找到具有不同ID的两个查询的联合

Posted

技术标签:

【中文标题】如何找到具有不同ID的两个查询的联合【英文标题】:How to find union of two query with distinct id 【发布时间】:2020-10-08 12:57:36 【问题描述】:

我的表格配置文件包含该配置文件的状态,即活动和非活动 请注意,一个 csr_id 有多个非活动状态记录,但肯定只有一个或没有状态为活动的记录

供您参考的表格:-

id | status    | csr_id |
---+-----------+---------
1  | inactive  |  1
2  | inactive  |  1
3  | inactive  |  1
4  | inactive  |  1
5  | inactive  |  2
6  | inactive  |  2
7  | inactive  |  2
8  | inactive  |  2
9  | active    |  2

查询参考:-

(select * from profile where csr_id IN (2,1) AND status = 'active') 
    UNION 
 (select DISTINCT ON (csr_id) *from profile where csr_id IN (2,1) AND status = 'inactive') order by status

结果:-

id  |  status  | csr_id |
-----+----------+---------------+--------
9   | active   |  2
4   | inactive |  1
8   | inactive |  2

预期结果:-

id  |  status  | csr_id |
-----+----------+---------
9   | active   |  2
4   | inactive |  1

因为 csr_id 2 处于活动状态,然后忽略 csr_id 2 的非活动条目

有什么办法吗?

【问题讨论】:

这个查询背后的逻辑是什么? 【参考方案1】:

您只能使用 distinct on 执行此操作:

select distinct on (csr_id) p.*
from profile p
order by csr_id, status, id desc

order by 升序active 子句将活动记录放在首位,然后优先考虑id 最大的记录。

Demo on DB Fiddle

编号 |状态 | csr_id -: | :------- | -----: 4 |不活跃 | 1 9 |活跃 | 2

【讨论】:

如果我们必须过滤特定的 csr_id 将不起作用,例如 select distinct on (csr_id) p.* from profile p where csr_id in (1,2) order by csr_id, status, id desc跨度> @Adwaitsoni:您只需在查询中添加where 子句,它就会按预期工作...... (order by csr_id,status) 这种情况在我的情况下可以正常工作 感谢大家的宝贵贡献。

以上是关于如何找到具有不同ID的两个查询的联合的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:对具有不同字段顺序的重复字段进行联合

Apollo / GraphQL 具有不同参数的相同查询

联合两个具有嵌套不同模式的数据框

SQL Server中具有不同列数的多个查询的联合结果

如何在 LINQ sql 中将两个表与一个具有不同值的表连接起来?

Bigquery - UNION ALL 具有不同参数的相同查询