微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL 查询在其他列中获取具有差异值的公共列

如何解决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=4c=5 的给定 a 的行,并按 bc 以相同方式排序。

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 举报,一经查实,本站将立刻删除。