我的桌子有超过6500万行和140列。数据来自多个来源,至少每个月提交一次。
我寻找一种快速的方法来从这些数据中获取特定字段,只有它们是唯一的。事实是,我想处理所有信息,以链接发送哪个发票与哪些识别号码,并由谁发送。问题是,我不想迭代超过6500万条记录。如果我能得到不同的价值,那么我只需要处理500万条记录而不是6500万条记录。请参阅下文,了解数据的说明和样本的SQL Fiddle
如果说客户每月提交一个与invoice_number
相关联的passport_number_1, national_identity_number_1 and driving_license_1
,我只想要一行显示。即4个字段必须是唯一的
如果他们提交上述内容30个月,那么在第31个月他们发送invoice_number
链接到passport_number_1, national_identity_number_2 and driving_license_1
,我也想选择此行,因为national_identity
字段是新的整行是独一无二的
linked to
我的意思是它们出现在同一行other_column
和yet_another_column
。请记住,该表有140列,所以不要
需要他们有关尝试重新创建方案的信息,请参阅此SQL fiddle。
从那个小提琴中,我期待得到如下结果:
id
。invoice_number
或submitted_by
。答案 0 :(得分:2)
从具有四个不同字段的组中获取一个代表性行(带有附加字段):
SELECT
distinct on (
invoice_number
, passport_number
, national_id_number
, driving_license_number
)
* -- specify the columns you want here
FROM my_table
where invoice_number is not null
and submitted_by is not null
;
请注意,除非您指定排序(documentation on distinct
)
修改强>
要按id
订购此结果,只需将order by id
添加到最后即可,但可以通过eiter使用CTE来完成
with distinct_rows as (
SELECT
distinct on (
invoice_number
, passport_number
, national_id_number
, driving_license_number
-- ...
)
* -- specify the columns you want here
FROM my_table
where invoice_number is not null
and submitted_by is not null
)
select *
from distinct_rows
order by id;
或将原始查询作为子查询
select *
from (
SELECT
distinct on (
invoice_number
, passport_number
, national_id_number
, driving_license_number
-- ...
)
* -- specify the columns you want here
FROM my_table
where invoice_number is not null
and submitted_by is not null
) t
order by id;
答案 1 :(得分:0)
从这些数据中获取特定字段的快速方法
我不这么认为。我认为您的意思是要从表中选择一个 distinct 行,而这些行不是唯一的。
据我所知,你只需要
SELECT distinct invoice_number, passport_number,
driving_license_number, national_id_number
FROM my_table
where invoice_number is not null
and submitted_by is not null;
在您的SQLFiddle示例中,它产生5行。