我那里有超过65万行和140列的表。 该数据来自几个方面,并至少每月提交。
我找了一个快速的方法抓住从这个数据只有在它们是唯一的特定字段。 事情是,我要处理的所有信息链接,发票与标识号发送,它是由谁发送。 问题是,我不想重复超过65万条记录。 如果我能得到不同的值,那么我将只需要处理说500万点的记录,而不是6500万。 见下面的数据的描述和SQL小提琴对样品
如果说客户端提交的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
我的意思是,他们出现在同一行 - 所有字段其可能有空发生在一个点上。
- 在“枢转/复合”列是INVOICE_NUMBER和submitted_by。 如果任何这些都是不存在的,丢弃行
- 我还需要包括上述数据的database_id的。 即这是由PostgreSQL数据库自动生成的primary_id
- 不需要被返回的域只有
other_column
和yet_another_column
。 记住表中有140列,以便不需要它们 - 的结果,建立一个新表,将举行这个独特的记录
看到这个SQL捣鼓一个试图重现的场景。
从小提琴,我期望像一个结果:
- 第1行,2行11:其中只有一个应保存,因为它们是完全一样的。 最好用最小的行
id
。 - 行4和第9行:因为它们是完全一样的其中一人将被丢弃。
- 第5行,第7,和8:会,因为他们缺少要么被丢弃
invoice_number
或submitted_by
。 - 那么结果将具有行(1,2或11),3,(4或9),6和10。
从与四个不同的字段的一组得到一个代表行(具有附加字段):
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
;
需要注意的是哪一行恰好返回,除非你指定的顺序不可预测的( 对文档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;
快速的方法抓住从这个数据具体领域唯一的,他们是唯一
我不认为如此。 我想你的意思是你要选择一组不同的表中的行中,他们不是唯一的。
至于我可以从你的描述说,你只是想
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行。