永洪社区

标题: 如何删除重复的数据谢谢! [打印本页]

作者: kevin2021    时间: 2021-12-13 20:18
标题: 如何删除重复的数据谢谢!
如何根据表的主键字段,删除重复的数据,只保留一条最新的数据?谢谢!

作者: yhdata_lyaa    时间: 2021-12-13 20:18
您是想在数据库的时候就先去重吗,使用相关的SQL语句,按照单一条件进行去重;
如果在查询时,可以使用SELECT DISTINCT 用来查询不重复记录的条数
如果有自服务数据集可以先把数据查询出来,再使用自服务数据集去重功能 (自服务数据集是需要单独付费)
作者: kevin2021    时间: 2021-12-14 09:36
本帖最后由 kevin2021 于 2021-12-14 09:42 编辑

SELECT DISTINCT是不行的,因为重复数据的来自两次更新的内容。比如第一天抽取了某个订单的交易记录,第二天该订单有新的交易记录又抽取了一次,这样这个订单就有2条数据了。我试下自服务数据集的去重功能
作者: kevin2021    时间: 2021-12-14 14:36
自服务数据集的去重功能不符合需求............这个去重功能只会删除完全相同的数据,我的场景只是主关键字是相同的
作者: 切莫意气用事    时间: 2021-12-14 16:12
可以对表中的数据进行组内排序,比如对主键分组,根据时间降序排序,生成排名,然后取排名为1的数据,就满足去重且取最新的数据了
作者: kevin2021    时间: 2022-1-10 18:30
切莫意气用事 发表于 2021-12-14 16:12
可以对表中的数据进行组内排序,比如对主键分组,根据时间降序排序,生成排名,然后取排名为1的数据,就满足去重 ...

这个思路很巧妙啊。怎么确定组内排名呢?
作者: 永洪Tech-CIDX    时间: 2022-1-10 19:38
kevin2021 发表于 2022-1-10 18:30
这个思路很巧妙啊。怎么确定组内排名呢?

可以参考此SQL:
select *
from test t
where
id
in
(
    select id from test t
    where
    datetime=(select max(datetime) from test t1 where t1.id=t.id)
    group by id
)
and
datetime=(select max(datetime) from test t1 where t1.id=t.id)
其中id 是id字段,datetime是日期字段
作者: kevin2021    时间: 2022-1-10 20:33
永洪Tech-CIDX 发表于 2022-1-10 19:38
可以参考此SQL:
select *
from test t

感谢。我其实只有一个源表。只是这个表的内容每天会增加,并且老的内容会有更新。比如:一个1月1日创建的项目A,当天的状态是“新建”,第二天是"进行中",第三天是"已完成"。

因为性能问题,不可能每次全量同步。我的数据集是这样设计的:
1)按创建日期,每个月的新建的项目数据存成一个数据集;
2)每天刷新“更新日期=当天”的数据(包含了当天新增的,已经很早创建但是当天有更新的)。
3)把第一步和第二步的数据合并在一起;
4)去掉第三步中项目ID重复的数据;
作者: 永洪Tech-CIDX    时间: 2022-1-10 21:08
如果要在bi中进行处理,我们需要在报告中新建计算列,因为选取最大值涉及到聚合计算,数据集中无法进行聚合计算。
1.新建计算列用于选取每个id的最大日期
fixed(col['id']::max(col['日期']))
这里我们为计算列修改名称为:最大日期
2.然后再新建一个计算列,用于标记最大日期行和非最大日期行,这里我们标记最大日期行为1,非最大日期行为0
if( dateGap(col['日期'],col['最大日期'],"dayofyear")==0)
then 1
else 0
end
最后在组件中使用过滤器,只选择计算列为1的行

作者: kevin2021    时间: 2022-1-11 10:01
永洪Tech-CIDX 发表于 2022-1-10 21:08
如果要在bi中进行处理,我们需要在报告中新建计算列,因为选取最大值涉及到聚合计算,数据集中无法进行聚合 ...

赞!这个达到了我最终想要的效果。




欢迎光临 永洪社区 (http://club.yonghongtech.com/) Powered by Discuz! X3.4