如何解决SQL 查询在其他列中获取具有差异值的公共列
我对 sql 不是很流利。我只是在制作最佳和高效的 sql 查询时面临一个小问题。我有一个表,其中包含 A 列和 B 列的复合键,如下所示
A | B | C |
---|---|---|
1 | 1 | 4 |
1 | 2 | 5 |
1 | 3 | 3 |
2 | 2 | 4 |
2 | 1 | 5 |
3 | 1 | 4 |
所以我需要的是为列 A 的特定值找到列 C 的值都为 4 和 5(4 和 5 只是示例)的行。所以 4 和 5 存在于两个 A 值(1 和2)。对于 A 值 3,存在 4 但不存在 5,因此我们不能接受它。
我的解释太混乱了。我希望你能明白。
在此之后,我只需要找到 4(第一个数字)的 B 值小于 5(第二个数字)的 B 值的那些。在这种情况下,对于 A=1,第 1 行(A-1,B-1,C-4)的 B 值小于第 2 行(A-1,B-2,C-5)所以我们取这一行。对于 A = 2,第 1 行(A-2,B-2,C-4)的 B 值大于第 2 行(A-2,B-1,C-5),因此我们不能接受。
我希望有人得到它并提供帮助。谢谢。
解决方法
我假设您想要 a
的值,如果这是真的。如果是这样,您可以使用聚合:
select a
from t
where c in (4,5)
group by a
having count(distinct c) = 2;
,
同时包含 c=4
和 c=5
的给定 a
的行,并按 b
和 c
以相同方式排序。
select a,b,c
from (
select tbl.*,count(*) over(partition by a) cnt,row_number() over (partition by a order by b) brn,row_number() over (partition by a order by c) crn
from tbl
where c in (4,5)
) t
where cnt = 2 and brn = crn;
编辑
如果参数的顺序很重要,则必须明确设置参数的位置。将 b
排序与显式参数位置进行比较
with params(val,pos) as (
select 4,2 union all
select 5,1
)
select a,p.pos
from tbl
join params p on tbl.c = p.val
) t
where cnt = (select count(*) from params) and brn = pos;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。