在插入 table2 之前,如何在 table1 的多个列上应用 count 和 distinct
Posted
技术标签:
【中文标题】在插入 table2 之前,如何在 table1 的多个列上应用 count 和 distinct【英文标题】:How do I apply count and distinct on multiple columns from table1 before inserting into table2 【发布时间】:2021-01-06 07:34:36 【问题描述】:情况:
我们公司刚刚从供应商处购买了 2000 万行。供应商将 Excel 中的数据插入 TABLE1(RDBMS 是 postgresql),不幸的是 TABLE1 没有 PK。我的经理希望我将所有 2000 万行插入到 TABLE2 中,但只有不同的记录。
EMPCODE 是唯一具有唯一值的列。 TABLE2 在插入之前为空。 TABLE1 没有主键和最后插入日期或 date_updated 列。 我使用主键 int NOT NULL 标识主键创建了 TABLE2。
什么是正确的 sql 脚本来获得正确的计数以获得所需的结果?
insert into TABLE2 (EMPCODE, FN, LN, STATE, TYPE)
select distinct(EMPCODE), FN, LN, STATE, TYPE from table1
或
insert into TABLE2 (EMPCODE, FN, LN, STATE, TYPE)
select distinct(EMPCODE, FN, LN, STATE, TYPE) from table1
或
insert into TABLE2 (EMPCODE, FN, LN, STATE, TYPE)
select EMPCODE, FN, LN, LAST(STATE), TYPE from table1
group by EMPCODE, FN, LN, STATE, TYPE
表 1
EMPCODE FirstName LastName STATE TYPE
ID111 Fred Perry CO CONSULTANT
ID111 Fred Perry UT CONSULTANT
ID111 Fred Perry AZ CONSULTANT
ID215 Tommy Hilfiger IL INTERN
ID215 Tommy Hilfiger IN INTERN
ID215 Tommy Hilfiger OH INTERN
ID215 Tommy Hilfiger NY INTERN
ID467 David Abercrombie TX REGULAR
ID467 David Abercrombie CA REGULAR
ID875 Ezra Fitch NV TERMINATED
ID875 Ezra Fitch OR TERMINATED
ID875 Ezra Fitch WA TERMINATED
ID875 Ezra Fitch UT TERMINATED
ID875 Ezra Fitch AZ TERMINATED
表 2 中的所需结果
EMPCODE FirstName LastName STATE TYPE
ID111 Fred Perry CO CONSULTANT
ID215 Tommy Hilfiger IL INTERN
ID467 David Abercrombie TX REGULAR
ID875 Ezra Fitch NV TERMINATED
问题是我无法查看所有数据(RAM 问题和 pgadmin4 非常慢)来决定哪个 sql 脚本效果最好。
【问题讨论】:
您能否从所有这些记录中解释为什么 ID111 Fred Perry CO CONSULTANT ID111 Fred Perry UT CONSULTANT ID111 Fred Perry AZ CONSULTANT 您需要来自 CO 而不是来自 UT 或 AZ 的 Fred Perry? table1中的数据是原始数据,是供应商从互联网上抓取的。根据业务利益相关者的要求,我需要做的就是获取每个 EMPCODE/FN 和 LN 的第一行。问题是没有主键和 dateupdated 列来应用 Max 函数。 那么看来,你的任务有很多正确的决定。您能否从 SELECT W.EMPCODE,W.FirstName,W.LastName,W.STATE,W.TYPE FROM ( SELECT Y.EMPCODE , Y.FirstName ,Y.LastName, Y. STATE ,Y. TYPE, ROW_NUMBER()OVER (PARTITION BY Y.EMPCODE ORDER BY.FIRSTNAME,Y.LASTNAME,Y.STATE,Y.TYPE)AS XCOL FROM YOURTABLE AS Y)AS W.XCOL=1; 我很早就迷路了。 . . “code”和“empcode”一样吗? 【参考方案1】:如果您使用的是 Postgres,并且希望每个 empcode
有一个任意行,那么您可以使用 distinct on
insert into TABLE2 (EMPCODE, FN, LN, STATE, TYPE)
select distinct on (EMPCODE) EMPCODE, FN, LN, STATE, TYPE
from table1
order by EMPCODE;
这不会阻止table2
中已经存在的重复项。如果您想避免此类重复,请在 table2(empcode)
上创建唯一索引或约束并使用 on conflict
子句。
【讨论】:
以上是关于在插入 table2 之前,如何在 table1 的多个列上应用 count 和 distinct的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Table1 插入 Table2,然后使用插入的 ID 插入 Table3