sql比较具有不同参数的条目

标签 sql postgresql

这里我们比较表中的条目

CREATE TABLE a
(id INT PRIMARY KEY,
p1 INT, p2 INT, p3 INT, .. , p15 INT)

p(n)取值从0到2

我必须获取所有具有独特参数组合的条目。这不是一件难事,所以我创建了一个这样的表

CREATE TEMPORARY TABLE b AS
(SELECT
        t1.id, 
        t2.p1, t2.p2, t2.p3, t2.p4, t2.p5, t2.p6, t2.p7, t2.p8,
        t2.p9, t2.p10, t2.p11, t2.p12, t2.p13, t2.p14, t2.p15
FROM
(
    SELECT 
        p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15
    FROM
        a
    GROUP BY
        p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15
    HAVING COUNT(*) = 1
)t2
LEFT JOIN a t1 on 
t2.p1 = t1.p1
AND t2.p2 = t1.p2
AND t2.p3 = t1.p3
AND t2.p4 = t1.p4
AND t2.p5 = t1.p5
AND t2.p6 = t1.p6
AND t2.p7 = t1.p7
AND t2.p8 = t1.p8
AND t2.p9 = t1.p9
AND t2.p10 = t1.p10
AND t2.p11 = t1.p11
AND t2.p12 = t1.p12
AND t2.p13 = t1.p13
AND t2.p14 = t1.p14
AND t2.p15 = t1.p15)

在这里,我们得到了具有独特参数组合的条目。

下一步是对表 A 中的每条记录查找表 B 中相差一个、两个和三个参数的所有记录。单个参数不同的记录不应超过一个,两个不同参数的记录不应超过两个等。

例如:

 id  |    p(n)          
-----+----------------    
 1   |000000000000000       
 2   |000000000000001  

我创建了一个表单的临时表

CREATE TEMPORARY TABLE c AS
(
SELECT
    cnt, id1, id2
FROM
(
    SELECT 
        (t1.p1 = t2.p1)+(t1.p2 = t2.p2)
        +(t1.p3 = t2.p3) +(t1.p4 = t2.p4) +(t1.p5 = t2.p5)
        +(t1.p6 = t2.p6) +(t1.p7 = t2.p7) +(t1.p8 = t2.p8)
        +(t1.p9 = t2.p9) +(t1.p10 = t2.p10) +(t1.p11 = t2.p11)
        +(t1.p12 = t2.p12) +(t1.p13 = t2.p13) +(t1.p14 = t2.p14)
        +(t1.p15 = t2.p15) AS cnt,
        t1.id id1,
        t2.id id2
    FROM 
        b AS t1,
        a AS t2
)
WHERE
    (cnt BETWEEN 12 AND 14)
    AND (id1 < id2)
)

这里我得到一个表,其中有 1、2 和 3 个参数不同的对

但是我在表中遇到了一个问题条目,大约有 100,000 个条目。此表太大(在家用 PC 上处理的数据)并且创建表时会给出一个很长的表。

也许这是获得一切的唯一方法,但是除了蛮力耦合(可能不是 SQL)之外,还有谁能想到解决这个问题的分析方法。当然,那会解决得更快......

任何提示将不胜感激!谢谢!

最佳答案

如果您想要一个只有唯一条目的表,您可以创建第二个表,将所有列作为复合主键的一部分:

CREATE TABLE b (
(id INT, p1 INT, p2 INT, p3 INT, .. , p15 INT)
PRIMARY KEY (p1, p2, p3, .. , p15))
IGNORE SELECT * FROM a;

关于sql比较具有不同参数的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18306326/

相关文章:

javascript - 在 PostgreSQL 中将 JSON 格式转换为关系数据?

sql - 获取表中行对之间的平均间隔

sql - 窗口函数或公用表表达式 : count previous rows within range

hibernate - 在 eclipse 中使用 wildfly 的 postgres 数据库

SQL Server Order By isnull 意外结果

mysql - 合并两个 SELECT 查询

sql - 在 SQL Server 中按多列分组

sql - 在我的情况下,如何在 Oracle 中编写 SQL?

sql - 在 SSRS 查询中显示从日期开始的年月

python - 保护删除 ForeignKey