在视图中隐藏重复的列单元格

Hide duplicate column cells in view

首先,this here doesn't solve my problem at all. I tried this也是。

我想生成随机的唯一虚假数据(名字和地址)

我使用了以下 SQL 请求:

CREATE OR REPLACE VIEW bah AS
SELECT DISTINCT A.VAL AS VORNAME,
    B.VAL AS ADRESSE
FROM ANON.FIRST_NAME A,
    ANON.ADDRESS B
    GROUP BY
    A.val,b.val
    HAVING COUNT(*) = 1;

结果显然是这样的(下一个名字的地址也会重复):

如何使名字和地址唯一?

请注意这是 CSV 格式:

预期结果:

"Abbas","Dippelstr. 736, 23892 Hainichen",
"Gilda","Noackallee 6/2, 24711 Malchin",
"Guenter","Fredy-Junk-Gasse 3, 90438 Schmölln",
"Hans-Ulrich","Karl-Peter-Kambs-Gasse 996, 15869 Sulzbach-Rosenberg"

示例数据:

Column1 (contains oids (which is irrelevant) and vals(relevant! hence listed below):
"Abbas", "Ante","Anthony"... 
Column2: (see above - oids and vals) 
"Benthinstraße 31, 35994 Kleve", "Cordula-Bachmann-Ring 4/8, 06292 Neustrelitz", "Danny-Fischer-Weg 8/9, 28346 Rastatt", "Eckbauergasse 157, 10570 Rudolstadt"

您在这里使用 select distinct 错误。

要获得预期结果,您需要像这样修改查询:

select distinct on (ADRESSE) * from bah;

这样您的结果行将是唯一的。

A CROSS JOIN 是错误的开始方法。以逗号 (,) 分隔的多个 FROM 项目是 cross-joined。参见:

anon.first_name 中的 10 个名称和 anon.address 中的 10 个地址形成 100 行的 Cartesian product,每个名称和地址乘以 cross-joined table。正是你不想要的。所有与重复的混淆都是由此造成的。在 之后应用 DISTINCT 交叉连接效率极低。

要每个名称和地址只使用一次,请在每一侧附加一个随机(或任意)数字并加入。

假设(由于缺少声明)每个来源 table 都有不同的条目。 (否则你需要使用 DISTINCT 的子查询来首先折叠重复 - window 像 row_number() 这样的函数被应用 before DISTINCT 在同一个查询水平。)

SELECT *
FROM  (
   SELECT row_number() OVER () AS arbitrary_nr, val AS vorname
   FROM   anon.first_name
   ) a
JOIN (
   SELECT row_number() OVER () AS arbitrary_nr, val AS adresse
   FROM   anon.address
   ) b USING (arbitrary_nr)

组合是任意,而不是随机。参见:

  • How can I get a random cartesian product in PostgreSQL?

结果具有较小 table 的基数。来自较大 table 的多余行将被跳过。

为了允许一些重复,你只需在一侧(或两侧)引入一些重复的数字(arbitrary_nr),或者同一行多个次,或具有相同任意数字的不同行。例如:

There could be like 2 persons living at the same address sometimes

SELECT *
FROM  (
   SELECT row_number() OVER (ORDER BY val) AS arbitrary_nr, val AS vorname
   FROM   anon.first_name
   UNION ALL
   SELECT row_number() OVER (ORDER BY val) - 1, val
   FROM   anon.first_name
   WHERE  random() > .9
   ) a
JOIN (
   SELECT row_number() OVER () AS arbitrary_nr, val AS adresse
   FROM   anon.address
   ) b USING (arbitrary_nr)

这第二次添加了约 10% 的所有名称。 (所以有些名字有两个地址。)这一次,名字是按字母顺序排列的。随机样本从0开始(- 1),数字只能增加得更慢,所以同名永远不可能得到相同的arbitrary_nr,同一个地址永远不会与同名组合两次。

只要至少有一侧获得任意(或随机)数字,结果仍然是任意(或随机)的。

多种种方法。很大程度上取决于您的确切输入以及对结果的确切要求。