Dan*_* S. 7 sql postgresql grouping
我需要根据优先级对来自多个来源的大量数据进行分组,但这些来源的数据质量不同 - 它们可能会丢失一些数据。任务是以尽可能完整的方式将这些数据分组到一个单独的表中。
例如:
create table grouped_data (
id serial primary key,
type text,
a text,
b text,
c int
);
create table raw_data (
id serial primary key,
type text,
a text,
b text,
c int,
priority int
);
insert into raw_data
(type, a, b, c, priority)
values
('one', null, '', 123, 1),
('one', 'foo', '', 456, 2),
('one', 'bar', 'baz', 789, 3),
('two', null, 'two-b', 11, 3),
('two', '', '', 33, 2),
('two', null, 'two-bbb', 22, 1);
Run Code Online (Sandbox Code Playgroud)
现在我需要对记录进行分组 by type, order by priority,取第一个非空和非空值,并将其放入grouped_data. 在这种情况下,afor group的值one将是foo因为保存该值的行比具有 的行具有更高的优先级bar。应该c是123,因为它具有最高的优先级。对于 group 也是如此two,对于每一列,我们采用非空、非空且具有最高优先级的数据,或者null如果不存在实际数据则回退到该数据。
最终grouped_data预计有以下内容:
('one', 'foo', 'baz', 123),
('two', null, 'two-bbb', 22)
Run Code Online (Sandbox Code Playgroud)
我尝试过分组、子选择、合并、交叉连接...唉,我对 PostgreSQL 的了解还不足以让它工作。我也想避免的一件事是一一浏览列,因为在现实世界中只有几十个列可以使用......
我一直用来搞乱这个的小提琴的链接:http://sqlfiddle.com/#!17/76699/1
更新:
谢谢你们!Oleksii Tambovtsev 的解决方案是最快的。对于一组与真实案例非常相似的数据(200 万条记录,约 30 个字段),只需 20 秒即可生成完全相同的数据集,而之前以编程方式生成的数据需要 20 多分钟。
eshirvana 的解决方案在 95 秒内执行相同的操作,Steve Kass 的解决方案在 125 秒内执行相同操作,而 Stefanov.sm - 308 秒(这仍然比编程方式快得多!)
谢谢你们 :)
你应该尝试这个:
SELECT
type,
(array_agg(a ORDER BY priority ASC) FILTER (WHERE a IS NOT NULL AND a != ''))[1] as a,
(array_agg(b ORDER BY priority ASC) FILTER (WHERE b IS NOT NULL AND b != ''))[1] as b,
(array_agg(c ORDER BY priority ASC) FILTER (WHERE c IS NOT NULL))[1] as c
FROM raw_data GROUP BY type ORDER BY type;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1300 次 |
| 最近记录: |