首页 > 解决方案 > 如何过滤最小日期并删除连接表中的重复日期?

问题描述

我正在尝试将三个表与父表连接起来,以获取客户 id访问 id访问日期的输出,如果有多个日期,则选择最旧的日期。所有四个表都包含 cust_id、visit_id 和 visit_date 变量,但 visit_id 是链接变量。我将四个表命名为 a、b、c 和 d,以简化下面的代码(a 是父表)。

我下面的当前代码让我更接近我想要的输出,但我不确定如何通过 visit_id 获得一个包含最旧日期的visit_date列,并且不确定如何删除重复项。任何帮助将不胜感激,如果我能澄清任何事情,请告诉我!

SELECT
    a.cust_id,
    a.visit_id,
    a.visit_date,
    b.visit_date,
    c.visit_date,
    d.visit_date
FROM a
LEFT JOIN b 
    ON a.visit_id = b.visit_id
LEFT JOIN c
    ON a.visit_id = c.visit_id
LEFT JOIN d
    ON a.visit_id = d.visit_id
WHERE a.visit_date IS NOT NULL
OR b.visit_date IS NOT NULL
OR c.visit_date IS NOT NULL
OR d.visit_date IS NOT NULL;

我当前的输出如下所示:

cust_id 访问ID 访问日期 访问日期 访问日期 访问日期
001 001 2013-05-23
002 002 2013-06-03 2013-05-27
003 003 2013-06-05 2013-06-05 2013-06-05
003 004 2013-07-09 2013-07-09 2013-07-06

我想要的输出如下所示:

cust_id 访问ID 访问日期
001 001 2013-05-23
002 002 2013-05-27
003 003 2013-06-05
003 004 2013-07-06

标签: sqlpostgresql

解决方案


您可以使用标量LEAST函数:

SELECT
    a.cust_id,
    a.visit_id,
    LEAST(a.visit_date, b.visit_date, c.visit_date, d.visit_date) AS visit_date
FROM a
LEFT JOIN b 
    ON a.visit_id = b.visit_id
LEFT JOIN c
    ON a.visit_id = c.visit_id
LEFT JOIN d
    ON a.visit_id = d.visit_id
WHERE
    a.visit_date IS NOT NULL OR
    b.visit_date IS NOT NULL OR
    c.visit_date IS NOT NULL OR
    d.visit_date IS NOT NULL;

推荐阅读