摆脱重复行的麻烦

Posted

技术标签:

【中文标题】摆脱重复行的麻烦【英文标题】:trouble getting rid of duplicate rows 【发布时间】:2021-11-26 03:03:32 【问题描述】:

我的基础数据包含多个在同一日期发生的实验室项目(A、B、C)。

id    datetime_1    order_datetime    item    value 
-----------------------------------------------------
1    9/1/21 09:57    9/2/21 04:21       A       13
1    9/1/21 09:57    9/2/21 04:21       B       8
1    9/1/21 09:57    9/2/21 04:21       C       11
1    9/1/21 09:57    9/3/21 16:00       A       10
1    9/1/21 09:57    9/3/21 16:00       B       4
1    9/1/21 09:57    9/3/21 16:00       C       7
1    9/2/21 02:30    9/2/21 04:21       A       13
1    9/2/21 02:30    9/2/21 04:21       B       8
1    9/2/21 02:30    9/2/21 04:21       C       11
1    9/2/21 02:30    9/3/21 16:00       A       10
1    9/2/21 02:30    9/3/21 16:00       B       4
1    9/2/21 02:30    9/3/21 16:00       C       7

我需要输出显示为:

id    datetime_1     a_level   b_level   c_level 
------------------------------------------------
1    9/1/21 09:57      13         8         11
1    9/2/21 02:30      13         8         11

我当前的代码是:

with lab_setup as (
select id, datetime_1, row_number() over (partition by id, datetime_1 order by order_datetime) as lab_order) 
from data 
group by id, datetime_1, order_datetime
)

, lab_first as (
select id, datetime_1, 
max(case when item = 'A' then value end) as a_level, 
max(case when item = 'B' then value end) as b_level, 
max(case when item = 'C' then value end) as c_level

from lab_setup

group by id, datetime_1, item, value 
) 

select * 
from lab_first 
group by id, datetime_1, a_level, b_level, c_level

问题是我不断收到重复行以响应此代码,如下所示:

id    datetime_1     a_level   b_level   c_level 
------------------------------------------------
1    9/1/21 09:57      13        null      null
1    9/1/21 09:57     null       null       11
1    9/1/21 09:57     null       8         null

我已经尝试过distinctgroup bymax(case when),但到目前为止,它仍然为每个datetime_1 提供多行,这不是我想要的。有谁知道如何帮助将这些多行合并为一个?

【问题讨论】:

【参考方案1】:

你很接近,但有很多额外的、不必要的工作,使查询变得比需要的更复杂。首先,发布的查询没有产生发布的结果。似乎沿线某处您抓住了错误的查询。发布的查询无效。 lab_first cte 使用来自 lab_setup 的项目和值,但 lab_setup 不包含其中任何一个。此外,lab first 的目的似乎是派生列lab_order,但之后没有使用。最后,主查询只选择从lab first cte 中选择的内容,而无需更改。因此,不需要 cte。只需将过滤(最大功能)合并到主程序中。所以(见demo)

select id
     , datetime_1 
     , max(case when item = 'A' then value end) as a_level 
     , max(case when item = 'B' then value end) as b_level 
     , max(case when item = 'C' then value end) as c_level  
  from data
 group by id, datetime_1
 order by id, datetime_1;

演示注意事项:只是重复目标数据值,但更改控制值。除了我没有得到完全相同的目标值外,我怎么知道后记。此外,1 (id) 的全域没有足够的区分性。对于演示,我更改了几行的值并添加了一些。结果看起来不错,但您必须做出决定。

【讨论】:

其实lab first是必要的,因为a、b、c级别在最早的实验室中并不总是最大的值。对我来说,获取 a、b、c 的最早记录是至关重要的部分。但我能够从您那里得到提示并删除不必要的 group by 字段 - 谢谢!

以上是关于摆脱重复行的麻烦的主要内容,如果未能解决你的问题,请参考以下文章

查找重复行的索引 [重复]

查找重复行的索引 [重复]

Django 计数具有重复值的行

在拆分为多个文件的大型数据框中查找重复行和包含重复行的文件

Pandas:如何删除重复的行,但保留所有行的最大值[重复]

仅保留 DataFrame 中连续重复行的第一行 [重复]