在插入 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

在插入触发器上从 table1 插入到 table2

sqlite python 插入

MySQL:如果 table1 中的行存在,则在 table2 上插入行

sqlserver,触发器做备份表如何插入当前时间?

如何使用额外的列执行“插入到 select *”查询?