重写相关子查询,红移抛出这种类型的相关子查询模式还不受支持

toe95027  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(551)

我正在处理一个查询,该查询需要将表a与表b左联接在a.user\u id=b.user\u id和b.day上,该表小于a.day,但最接近a.day。
以下是我写的:

  1. Select A.user_id, A.date, b1.v1 from A
  2. Left Join B as b1
  3. on A.user_id=b1.user_id and b1.day=(Select max(day) from B as b2 where b2.user_id=A.user_id
  4. and b2.day < A.day)

我在python中使用psycopg2执行此操作,它返回错误: This type of correlated subquery pattern is not supported yet .
有人能帮我重写这个,这样它就不用相关子查询了吗?

a14dhokn

a14dhokn1#

一种方法是:

  1. Select A.user_id, A.date, b1.v1, max(b1.day)
  2. from A Left Join B as b1 on A.user_id=b1.user_id and b1.day < A.day
  3. group by A.user_id, A.date, b1.v1;
7rfyedvj

7rfyedvj2#

一种方法相当昂贵,但是…:

  1. select . . .
  2. from (select A.user_id, A.date, b1.v1,
  3. row_number() over (partition by a.user_id, a.date order by b.day desc) as seqnum
  4. from A Left Join
  5. B
  6. on A.user_id = b1.user_id and b.day < a.day
  7. ) ab
  8. where seqnum = 1;

可能还有其他方法可以实现这一点——而且性能更好。如果需要的话,可以问一个新问题,提供示例数据、期望的结果,以及对要实现的逻辑的清晰解释。

相关问题