Postgresql 如何根据另一个选择类的结果值在选择类中添加条件 我需要一个Postgres查询来获取“a值”、“a值日期”、“B值”和“B值日期” B值和日期应在“A值日期”的95到100天之间
我需要查询“A值”和“A值日期”,不知道如何使用结果(A值)获取B值和日期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没有表定义的情况下,我根据输出列和原始查询开发了它。此外,我
输出: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)