给出下表:

CREATE TABLE people (
    name TEXT PRIMARY KEY,
    age  INT  NOT NULL
);

INSERT INTO people VALUES
    ('Lisa',     30),
    ('Marta',    27),
    ('John',     32),
    ('Sam',      41),
    ('Alex',     12),
    ('Aristides',43),
    ('Cindi',     1)
    ;

我使用自连接将特定列的each value与同一列的all the other values进行比较.我的查询如下所示:

SELECT DISTINCT A.name as child
FROM people A, people B
WHERE A.age + 16 < B.age;

该查询旨在根据年龄差异找出潜在的儿子/女儿.更具体地说,我的目标是确定可能与父母之一住在同一所房子里的人(按姓名排序),假设子元素和父母之间的年龄差异至少为16岁.

现在我想把这种逻辑与另一个表中的信息结合起来.

另一张桌子看起来像这样:

CREATE TABLE houses (
    house_name TEXT NOT NULL,
    house_member TEXT NOT NULL REFERENCES people(name)
);    

INSERT INTO houses VALUES
        ('house Smith', 'Lisa'),
        ('house Smith', 'Marta'),
        ('house Smith', 'John'),
        ('house Doe', 'Lisa'),
        ('house Doe', 'Marta'),
        ('house Doe', 'Alex'),
        ('house Doe', 'Sam'),
        ('house McKenny', 'Aristides'),
        ('house McKenny', 'John'),
        ('house McKenny', 'Cindi')
        ;

这两个表可以连接ON houses.house_member = people.name.

更具体地说,我想指出子元素们只在同一所房子里.将每个人的年龄与所有其他人的年龄进行比较是没有意义的,而是it would be more efficient to compare the age of each person with all the other people in the same house.

我的 idea 是从上面执行自连接,但只在PARTITION BY household_name以内.然而,我认为这不是一个好主意,因为我没有聚合函数.GROUP BY条语句也是如此.我能在这里做什么?

预期输出应如下,按house_member排序:

house_member
Alex
Cindi

为了简单起见,我创建了一个fiddle.

推荐答案

首先,连接两个表以构建一个包含所有三位信息的表:house_namehouse_memberage.

然后像最初一样将其自身加入,并添加一个额外的过滤器,以仅查看相同的家庭.

WITH
CTE_All
AS
(
    SELECT
        houses.house_name
        ,houses.house_member
        ,people.age
    FROM
        houses
        INNER JOIN people ON people.name = houses.house_member
)
SELECT DISTINCT
    Children.house_name
    ,Children.house_member AS child_name
FROM
    CTE_All AS Children
    INNER JOIN CTE_All AS Parents 
        ON Children.age + 16 < Parents.age
        -- this is our age difference
        AND Children.house_name = Parents.house_name
        -- within the same house
;

所有这些都是一个查询.您不必使用CTE,可以将其作为子查询内联,但使用CTE更具可读性.

Result

house_name    | child_name
:------------ | :---------
house Doe     | Alex      
house McKenny | Cindi     

Sql相关问答推荐

在postgresql中使用来自另一个字段的日期名称作为JSONB查询中的关键字

如何转换和汇总行数

Android房间fts4匹配语法AND OR

Oracle SQL根据列中的条件 Select 最大记录数

缺少日期标识

MS Access问题查询中的自定义字段

每个学校 Select N个最新的行,但跳过同一学生的重复行

SQL查询正在工作,但返回空结果

存储过程太慢

日期逻辑(查找过go 90 天内的第一个匹配行)

将最近的结束日期与开始日期相匹配

PostgreSQL:从多个字段收集特定指标的最后一个条目

SQL for Smarties 类型问题:从表中 Select 记录,并对某些值进行分组

在SQL中实现表格数据透视类型报表

BigQuery导航函数计算ID

PostgreSQL中如何提取以特定字符开头的字符串中的所有单词?

根据开始时间和结束时间计算has_impact字段

将 MERGE 语句与 Oracle PL/SQL 表类型一起使用时,导致无效数据类型错误的原因是什么?

在 postgresql 中,我可以将其组合成一个查询吗?

Athena:从字符串birth_dt列计算年龄