SQL 查询在其他列中获取具有差异值的公共列
SQL Query get common column with diff values in other columns
我对 SQL 不是很流利。我只是在制作最佳和高效的 sql 查询时遇到了一个小问题。我有一个 table,其中包含 A 列和 B 列的复合键,如下所示
A
B
C
1
1
4
1
2
5
1
3
3
2
2
4
2
1
5
3
1
4
所以我需要找到行,其中 C 列对于 A 列的特定值同时具有 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;
包含给定 a
的 c=4
和 c=5
的行,并按 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, b, c
from (
select tbl.*,
count(*) over(partition by a) cnt,
row_number() over (partition by a order by b) brn,
p.pos
from tbl
join params p on tbl.c = p.val
) t
where cnt = (select count(*) from params) and brn = pos;
我对 SQL 不是很流利。我只是在制作最佳和高效的 sql 查询时遇到了一个小问题。我有一个 table,其中包含 A 列和 B 列的复合键,如下所示
A | B | C |
---|---|---|
1 | 1 | 4 |
1 | 2 | 5 |
1 | 3 | 3 |
2 | 2 | 4 |
2 | 1 | 5 |
3 | 1 | 4 |
所以我需要找到行,其中 C 列对于 A 列的特定值同时具有 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;
包含给定 a
的 c=4
和 c=5
的行,并按 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, b, c
from (
select tbl.*,
count(*) over(partition by a) cnt,
row_number() over (partition by a order by b) brn,
p.pos
from tbl
join params p on tbl.c = p.val
) t
where cnt = (select count(*) from params) and brn = pos;