通过排序和过滤删除重复项
Remove duplicates by sorting and filtering
我的 table 中有如下所示的数据:
输入:
version value code type
PMS 0.00 01 HOURS
000 312.00 01 HOURS
000 0.00 04 HOURS
PMS 0.00 01 NON STOCK
000 835.00 01 NON STOCK
000 835.00 04 NON STOCK
- 第 1 步:按代码排序,即 01 和 04。
- 第 2 步:按类型排序,即 HOURS 和 NON STOCK。
- 第3步:按版本检索,如果是0.00则检索记录。
输出解释:
对于代码 = 01,
我们有 4 条记录,2 条记录类型 = HOURS,2 条记录类型 = NON STOCK。但选择版本不等于 PMS 的记录(由于列类型重复)。因此我们得到两个代码为 01 的输出。
000 312.00 01 HOURS
000 835.00 01 NON STOCK
对于代码 = 04,
我们有 2 条记录,1 条记录类型 = HOURS,1 条记录类型 = NON STOCK。因为我们这里没有重复的列类型,所以在这种情况下不需要比较版本。因此我们得到两个代码为 01
的输出
000 0.00 04 HOURS
000 835.00 04 NON STOCK
(数据库引擎是 Azure databricks)
预期输出:
version value code type
000 312.00 01 HOURS
000 835.00 01 NON STOCK
000 0.00 04 HOURS
000 835.00 04 NON STOCK
假设如果没有重复行,即使版本是PMS也需要拉取记录。
试试这个:
select
*
from(
select
a.*,
case when b.code is not null and version <>'PMS' then 1
when b.code is null then 1
else 0 end as filter_val
from
input a
left outer join
(Select
code,
type
from input
group by
code,
type having count(*) > 1) b
on a.code=b.code
and a.type=b.type) x
where filter_val=1;
你可以这样做:
select
version, value, code, type
from (
select *,
row_number() over(partition by code, type order by version) as rn
from t
) x
where rn = 1
order by code, type
我的 table 中有如下所示的数据:
输入:
version value code type
PMS 0.00 01 HOURS
000 312.00 01 HOURS
000 0.00 04 HOURS
PMS 0.00 01 NON STOCK
000 835.00 01 NON STOCK
000 835.00 04 NON STOCK
- 第 1 步:按代码排序,即 01 和 04。
- 第 2 步:按类型排序,即 HOURS 和 NON STOCK。
- 第3步:按版本检索,如果是0.00则检索记录。
输出解释:
对于代码 = 01, 我们有 4 条记录,2 条记录类型 = HOURS,2 条记录类型 = NON STOCK。但选择版本不等于 PMS 的记录(由于列类型重复)。因此我们得到两个代码为 01 的输出。
000 312.00 01 HOURS
000 835.00 01 NON STOCK
对于代码 = 04, 我们有 2 条记录,1 条记录类型 = HOURS,1 条记录类型 = NON STOCK。因为我们这里没有重复的列类型,所以在这种情况下不需要比较版本。因此我们得到两个代码为 01
的输出 000 0.00 04 HOURS
000 835.00 04 NON STOCK
(数据库引擎是 Azure databricks)
预期输出:
version value code type
000 312.00 01 HOURS
000 835.00 01 NON STOCK
000 0.00 04 HOURS
000 835.00 04 NON STOCK
假设如果没有重复行,即使版本是PMS也需要拉取记录。 试试这个:
select
*
from(
select
a.*,
case when b.code is not null and version <>'PMS' then 1
when b.code is null then 1
else 0 end as filter_val
from
input a
left outer join
(Select
code,
type
from input
group by
code,
type having count(*) > 1) b
on a.code=b.code
and a.type=b.type) x
where filter_val=1;
你可以这样做:
select
version, value, code, type
from (
select *,
row_number() over(partition by code, type order by version) as rn
from t
) x
where rn = 1
order by code, type