通过排序和过滤删除重复项

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

【讨论】:

以上是关于通过排序和过滤删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

从 Vue 中的 v-for 列表中删除重复项

如何在按唯一日期时间排序时删除重复项

从排序列表中删除重复项不通过所有测试用例

从排序数组中删除重复项

从给定字符串中删除重复项(不对其进行排序)[重复]

单行删除重复项,保持列表排序 [重复]