如何找到具有不同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的两个查询的联合的主要内容,如果未能解决你的问题,请参考以下文章