在视图中隐藏重复的列单元格
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
,同一个地址永远不会与同名组合两次。
只要至少有一侧获得任意(或随机)数字,结果仍然是任意(或随机)的。
有多种种方法。很大程度上取决于您的确切输入以及对结果的确切要求。
首先,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
,同一个地址永远不会与同名组合两次。
只要至少有一侧获得任意(或随机)数字,结果仍然是任意(或随机)的。
有多种种方法。很大程度上取决于您的确切输入以及对结果的确切要求。