在另一个 INNER JOIN 中使用 INNER JOIN 结果 table

Using INNER JOIN resulting table in another INNER JOIN

我不太确定标题是否真的对应,也许我的方法是错误的。

我有以下数据库结构:

TABLE producers
    id

TABLE data
    id
    date 
    value 
    producer_id OneToMany

首先,对于每个制作人,我想获得最新的 date 注册 data。下面的代码正是这样做的:

SELECT producers.id AS producer_id, max.date AS max_date
FROM producers
INNER JOIN data ON producers.id = data.producer_id
INNER JOIN (
    SELECT producer_id, MAX(date) AS date
    FROM data
    GROUP BY producer_id
) AS max USING (producer_id, date)

结果table是:

----------------------------------------------------
|   producer_id   |             max_date           |
----------------------------------------------------
|       5         |  2022-01-01 01:45:00.000 +0000 |
|       7         |  2022-01-01 01:45:00.000 +0000 |
|       14        |  2022-01-01 01:45:00.000 +0000 |
|       15        |  2022-01-01 01:45:00.000 +0000 |
|       17        |  2022-01-01 01:45:00.000 +0000 |
----------------------------------------------------

接下来我需要的是 SUM 每个生产者的所有 data 记录 WITH date 大于 max_date 我们在上一个查询的 INNER JOIN 之后为每个生产者获得了。 SUM() 将在列 value 上执行。

希望这很清楚,如果不清楚,请告诉我。我试过做另一个 INNER JOIN 并在 WHERE 子句中使用 table max 但是我得到一个错误告诉我 table 在那里,但是无法在该部分查询中使用。

也许另一个 INNER JOIN 不是解决方案。在这里,我受到 SQL 知识的限制,我真的不知道应该阅读哪些关键字 in-depth 以了解什么是最好的方法以及如何去做。因此,将我重定向到最佳路径的信息真的很有帮助。

提前致谢。

编辑:忘记指定 SUM() 将在哪一列执行。

编辑 2:刚刚意识到我在这里要问的是,结果将始终为空 table,因为永远不会有 date 更大的记录。当我写我的数据库的简化版本时,忘记添加一个table/join,这就是原因。但最终 approach/solution 仍然是相同的,只是应用于不同的 table。再次抱歉。

问题中的第一个查询可以使用 distinct onorder by 大大简化:

select distinct on (p.id)
       p.id, d.date
from producers p
join data d on p.id = d.producer_id
order by p.id, d.date desc;

至于“将每个生产者的所有数据记录与日期大于 max_date 相加”——好吧,none 存在日期大于最新的。这是一个这样做的查询(即使结果将是空的)

select producer_id, sum(value)
from data d inner join -- the query above follows
(
  select distinct on (p.id)
         p.id producer_id, d.date
  from producers p
  join data d on p.id = d.producer_id
  order by p.id, d.date desc
) t using (producer_id)
where d.date > t.date
group by producer_id;