摆脱重复行的麻烦
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
我已经尝试过distinct
、group by
、max(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
字段 - 谢谢!以上是关于摆脱重复行的麻烦的主要内容,如果未能解决你的问题,请参考以下文章