【发布时间】:2021-02-04 02:55:07
【问题描述】:
我有两张包含日期信息的表格。我想加入两个表,条件是Table_Y 中指定的日期位于TABLE_X 的最小和最大日期之间。
我有以下查询,我在其中确定TABLE_X 中的最小和最大日期并执行连接以包含两个表的信息。我应该如何包含一个仅包含 bb.date between aa.min_startdate and aa.max_startdate 的行的语句?请注意,TABLE_Y 的日期列未在当前查询中指定,因为我不想将其包含在最终表中。
SELECT
aa.column_1,
bb.column_2,
bb.column_3,
bb.column_4,
MIN(aa.startdate) AS min_startdate,
MAX(COALESCE(aa.enddate, CURRENT_DATE)) AS max_startdate
FROM TABLE_X AS aa
INNER JOIN TABLE Y AS bb
ON bb.column_2 = aa.column_2
AND bb.column_3 = aa.column_3
GROUP BY 1, 2, 3, 4
我正在考虑将WHERE 或HAVING 函数与bb.date between aa.min_startdate and aa.max_startdate 结合使用的顺序,但这只会由于聚合函数而导致错误。
【问题讨论】:
-
在 HAVING 子句中使用 MAX(COALESCE(aa.enddate, CURRENT_DATE))。
-
添加
HAVING bb.date <= MAX(COALESCE(aa.enddate, CURRENT_DATE))会报错:Selected non-aggregate values must be part of the associated group.这是因为bb.date不属于GROUP BY。添加它会杀死我当前使用它的GROUP BY的功能。 -
您目前的查询似乎有冲突,您想在
min_startdate和max_startdate的基础上加入bb,但它们的计算取决于bb中的值(因为@987654339 @ 列在group by子句中)。您真的想要基于bb中的值还是仅基于aa.column1的最小/最大 start_date? -
@Nick,在
TABLE_X的第 2 - 4 列中也存在。它们与TABLE_Y中的相同列具有相同的值。如果我没记错的话,我是从aa还是bb给他们打电话都没有关系。但是,我确实需要GROUP BY的所有四列来确定min_startdate和max_enddate。 -
好的,不清楚
bb.column_4是否也在aa中。在这种情况下,为什么不使用 CTE 来计算min和max日期,然后在适当的列值上将其连接到aa和bb以获得您想要的结果?
标签: sql join group-by having teradata-sql-assistant