【问题标题】:SQL Query: Perform a join + group by + date conditionSQL查询:执行join + group by + date条件
【发布时间】: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

我正在考虑将WHEREHAVING 函数与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_startdatemax_startdate 的基础上加入bb,但它们的计算取决于bb 中的值(因为@987654339 @ 列在 group by 子句中)。您真的想要基于 bb 中的值还是仅基于 aa.column1 的最小/最大 start_date?
  • @Nick,在TABLE_X 的第 2 - 4 列中也存在。它们与TABLE_Y 中的相同列具有相同的值。如果我没记错的话,我是从aa 还是bb 给他们打电话都没有关系。但是,我确实需要 GROUP BY 的所有四列来确定 min_startdatemax_enddate
  • 好的,不清楚bb.column_4 是否也在aa 中。在这种情况下,为什么不使用 CTE 来计算 minmax 日期,然后在适当的列值上将其连接到 aabb 以获得您想要的结果?

标签: sql join group-by having teradata-sql-assistant


【解决方案1】:

我有两张包含日期信息的表格。我想加入两个表,条件是 Table_Y 中指定的日期介于 TABLE_X 的最小和最大日期之间。

我会建议这样的事情:

select . . . 
from table_y y join
     (select x.*, min(start_date) over () as min_start_date,
             max(start_date) over () as max_start_date
      from x
     ) x
     on y.date between x.min_start_date and x.max_start_date;

您的示例查询似乎具有您未描述的其他条件。这回答了您提出的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多