Postgresql 如何根据另一个选择类的结果值在选择类中添加条件 我需要一个Postgres查询来获取“a值”、“a值日期”、“B值”和“B值日期” B值和日期应在“A值日期”的95到100天之间

Postgresql 如何根据另一个选择类的结果值在选择类中添加条件 我需要一个Postgres查询来获取“a值”、“a值日期”、“B值”和“B值日期” B值和日期应在“A值日期”的95到100天之间,postgresql,Postgresql,我需要查询“A值”和“A值日期”,不知道如何使用结果(A值)获取B值和日期 B_值和B_日期来自同一sol_pro表 A_值日期后的95-100天(如果95-100之间有更多的值,我只需要一个(最近的)值) 输出:id=112233,A_-Value=“weight=210.25”,A_-Value\u-date=12-12-2020,B_-Value=“weight=220.25”,B_-Value\u-date=12-12-2020没有表定义的情况下,我根据输出列和原始查询开发了它。此外,我

我需要查询“A值”和“A值日期”,不知道如何使用结果(A值)获取B值和日期

  • B_值和B_日期来自同一sol_pro表
  • A_值日期后的95-100天(如果95-100之间有更多的值,我只需要一个(最近的)值)

  • 输出:id=112233,A_-Value=“weight=210.25”,A_-Value\u-date=12-12-2020,B_-Value=“weight=220.25”,B_-Value\u-date=12-12-2020

    没有表定义的情况下,我根据输出列和原始查询开发了它。此外,我还需要为这些数据做一些补充,但下面的内容应该足够让您了解其中所涉及的技术。它实际上是一个简单的连接操作,只是它是sol_pol表上的自连接。(即它与自身相连)。注意--表示的注释,假设您有表
    用户
    度量值

    # create table users (id integer);
    # create table measures (user_id integer, value decimal, created_at date);
    
    它们充满了测试数据:

    INSERT INTO users VALUES (1), (2), (3);
    INSERT INTO measures VALUES (1, 100, '9/10/2020'), (1, 103, '9/15/2020'), (1, 104, '10/2/2020');
    INSERT INTO measures VALUES (2, 200, '9/11/2020'), (2, 207, '9/21/2020'), (2, 204, '10/1/2020');
    INSERT INTO measures VALUES (3, 300, '9/12/2020'), (3, 301, '10/1/2020'), (3, 318, '10/12/2020');
    
    查询:

    WITH M AS (
      SELECT
        A.user_id,
        A.value AS A_value, A.created_at AS A_date,
        B.value AS B_value, B.created_at AS B_date
      FROM measures A
      LEFT JOIN measures B ON
        A.user_id = B.user_id AND
        B.created_at >= A.created_at + INTERVAL '5 days' AND
        B.created_at <= A.created_at + INTERVAL '10 days'
      ORDER BY
        user_id, A_date, B_date
    )
    SELECT DISTINCT ON (user_id) * FROM M;
    

    另外,在使用
    DISTINCT ON()
    子句时,必须使用
    ODORDER BY
    仔细排序表行,因为PostgreSQL将只保留第一条记录,而丢弃其他记录。

    请查看。然后,为你的问题准备一个模板,大大提高了你获得满意答案的机会。这里还有几个问题。B_值和B_日期的来源是什么;另外还有Sol_pro表或其他表?。至于B_日期的95-100天范围,是在A_日期之前的95-100天吗?日期后95-100天,在日期之前和/或之后,范围为日期前95天和日期后100天,其他可能性?请发布示例输入日期-文本无图像,以及该数据的预期输出。您好@Belayer,谢谢您的建议,我们一定会查看它。对于您上面的问题1)来自同一sol_pro表的B_值和B_日期,2)A_值日期后95-100天(如果95-100之间有更多的值,我只需要一个(最近的)值)预期输出:id=112233,A_值=“weight=210.25”,A_值\u日期=12-12-2020,B_值=“weight=220.25”,B_值\u日期=12-12-2020OK,这是一个开始。我复制了这个问题的答案。以后请不要把答案放在评论中,而是放在原来的问题中。但是表说明和输入数据在哪里。没有产生它的输入的输出不是很有用。此外,该输入的布局(表DDL)非常有用。也许,我会尝试一些东西,但不能保证。你的输出与你的描述不一致:描述说B_日期应该是A_日期后的95-100天。但您的输出日期与2020年12月12日相同。请解释一下。
    INSERT INTO users VALUES (1), (2), (3);
    INSERT INTO measures VALUES (1, 100, '9/10/2020'), (1, 103, '9/15/2020'), (1, 104, '10/2/2020');
    INSERT INTO measures VALUES (2, 200, '9/11/2020'), (2, 207, '9/21/2020'), (2, 204, '10/1/2020');
    INSERT INTO measures VALUES (3, 300, '9/12/2020'), (3, 301, '10/1/2020'), (3, 318, '10/12/2020');
    
    WITH M AS (
      SELECT
        A.user_id,
        A.value AS A_value, A.created_at AS A_date,
        B.value AS B_value, B.created_at AS B_date
      FROM measures A
      LEFT JOIN measures B ON
        A.user_id = B.user_id AND
        B.created_at >= A.created_at + INTERVAL '5 days' AND
        B.created_at <= A.created_at + INTERVAL '10 days'
      ORDER BY
        user_id, A_date, B_date
    )
    SELECT DISTINCT ON (user_id) * FROM M;
    
    user_id | a_value |   a_date   | b_value |   b_date
    ---------+---------+------------+---------+------------
           1 |     100 | 2020-09-10 |     103 | 2020-09-15
           2 |     200 | 2020-09-11 |     207 | 2020-09-21
           3 |     300 | 2020-09-12 |  [NULL] | [NULL]
    (3 rows)