通过排序和过滤删除重复项
Posted
技术标签:
【中文标题】通过排序和过滤删除重复项【英文标题】:Remove duplicates by sorting and filtering 【发布时间】:2021-12-07 09:03:30 【问题描述】:我的表格中有如下数据:
输入:
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
-
第一步:按代码排序,01和04。
第 2 步:按类型排序,即 HOURS 和 NON STOCK。
第 3 步:按版本检索,如果为 0.00 则检索记录。
输出说明:
对于代码 = 01, 我们有 4 条记录,类型 = HOURS 的 2 条记录和类型 = NON STOCK 的 2 条记录。但选择版本不等于 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 怎么办?你还想要吗? 是的,在这种情况下(没有重复),需要 PMS 记录。仅当存在基于类型的重复项时才检查 PMS 请指定您使用的数据库引擎(例如 mysql、SQL Server、Sqlite 等) Azure 数据块 - SQL Server 【参考方案1】:假设如果没有重复的行,即使版本是 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;
【讨论】:
非常感谢!!这对我有用【参考方案2】:你可以这样做:
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
【讨论】:
以上是关于通过排序和过滤删除重复项的主要内容,如果未能解决你的问题,请参考以下文章