SQL 理论:过滤掉一列中的重复项,选择另一列中的最低值
SQL theory: Filtering out duplicates in one column, picking lowest value in other column
我正在尝试找出从结果集中删除行的最佳方法,其中一列中的值或另一列中的值在结果集中有重复项。
假设查询的结果如下:
a_value | b_value
-----------------
1 | 1
2 | 1
2 | 2
3 | 1
4 | 3
5 | 2
6 | 4
6 | 5
我想做的是:
- 消除 a_value
中所有具有重复值的行
- 只为给定的 b_value
选择 1 行
所以我希望过滤后的结果在消除 a_value 个重复项后像这样结束:
a_value | b_value
-----------------
1 | 1
3 | 1
4 | 3
5 | 2
然后只挑一个就这样b_value:
a_value | b_value
-----------------
1 | 1
4 | 3
5 | 2
对于如何通过 SQL.
以高效方式完成此任务的建议,我将不胜感激
1) 在内部查询中,我避免了 a_value 中存在的所有重复项
列并从输入 table 中获取所有剩余行并存储它们
作为 t2。通过将 t2 与 t1 连接起来,将会有完整的数据,没有任何重复
您的需求排名第一。
SELECT t1.*
FROM Table t1,
(
SELECT a_value
FROM Table
GROUP BY a_value
HAVING COUNT(*) = 1
) t2
WHERE t1.a_value = t2.a_value;
2) 获得过滤后的数据后,我将为步骤 1 中获得的过滤数据集中的每一行分配排名,并且我只选择排名为 1 的行。
SELECT X.a_value,
X.b_value
FROM
(
SELECT t1.*,
ROW_NUMBER() OVER ( PARTITION BY t1.b_value ORDER BY t1.a_value,t1.b_value ) AS rn
FROM Table t1,
(
SELECT a_value
FROM Table
GROUP BY a_value
HAVING COUNT(*) = 1
) t2
WHERE t1.a_value = t2.a_value
) X
WHERE X.rn = 1;
with
q_res ( a_value, b_value ) as (
select 1, 1 from dual union all
select 2, 1 from dual union all
select 2, 2 from dual union all
select 3, 1 from dual union all
select 4, 3 from dual union all
select 5, 2 from dual union all
select 6, 4 from dual union all
select 6, 5 from dual
)
-- end test data; solution begins below
select min(a_value) as a_value, b_value
from (
select a_value, min(b_value) as b_value
from q_res
group by a_value
having count(*) = 1
)
group by b_value
order by a_value -- ORDER BY is optional
;
A_VALUE B_VALUE
------- -------
1 1
4 3
5 2
我正在尝试找出从结果集中删除行的最佳方法,其中一列中的值或另一列中的值在结果集中有重复项。
假设查询的结果如下:
a_value | b_value
-----------------
1 | 1
2 | 1
2 | 2
3 | 1
4 | 3
5 | 2
6 | 4
6 | 5
我想做的是:
- 消除 a_value 中所有具有重复值的行
- 只为给定的 b_value 选择 1 行
所以我希望过滤后的结果在消除 a_value 个重复项后像这样结束:
a_value | b_value
-----------------
1 | 1
3 | 1
4 | 3
5 | 2
然后只挑一个就这样b_value:
a_value | b_value
-----------------
1 | 1
4 | 3
5 | 2
对于如何通过 SQL.
以高效方式完成此任务的建议,我将不胜感激1) 在内部查询中,我避免了 a_value 中存在的所有重复项
列并从输入 table 中获取所有剩余行并存储它们
作为 t2。通过将 t2 与 t1 连接起来,将会有完整的数据,没有任何重复
您的需求排名第一。
SELECT t1.*
FROM Table t1,
(
SELECT a_value
FROM Table
GROUP BY a_value
HAVING COUNT(*) = 1
) t2
WHERE t1.a_value = t2.a_value;
2) 获得过滤后的数据后,我将为步骤 1 中获得的过滤数据集中的每一行分配排名,并且我只选择排名为 1 的行。
SELECT X.a_value,
X.b_value
FROM
(
SELECT t1.*,
ROW_NUMBER() OVER ( PARTITION BY t1.b_value ORDER BY t1.a_value,t1.b_value ) AS rn
FROM Table t1,
(
SELECT a_value
FROM Table
GROUP BY a_value
HAVING COUNT(*) = 1
) t2
WHERE t1.a_value = t2.a_value
) X
WHERE X.rn = 1;
with
q_res ( a_value, b_value ) as (
select 1, 1 from dual union all
select 2, 1 from dual union all
select 2, 2 from dual union all
select 3, 1 from dual union all
select 4, 3 from dual union all
select 5, 2 from dual union all
select 6, 4 from dual union all
select 6, 5 from dual
)
-- end test data; solution begins below
select min(a_value) as a_value, b_value
from (
select a_value, min(b_value) as b_value
from q_res
group by a_value
having count(*) = 1
)
group by b_value
order by a_value -- ORDER BY is optional
;
A_VALUE B_VALUE
------- -------
1 1
4 3
5 2