Sql Having子句使用MAX不能像我在配置单元查询中预期的那样工作

Sql Having子句使用MAX不能像我在配置单元查询中预期的那样工作,sql,hadoop,hive,hiveql,Sql,Hadoop,Hive,Hiveql,我正在尝试选择仅与表中的max DATE1列和上个月匹配的记录 我曾尝试使用标准having子句语法编写此文档,但这不起作用,因此我能够使用CTE获得预期的结果。这个解决方案应该适用于我正在尝试做的事情,但我更想理解为什么HAVING子句不起作用。在这些示例中,MAX(DATE1)=2018-02-28 询问我是否期望工作 select ID, sum(money) as money, date1 from table1 group by ID,

我正在尝试选择仅与表中的max DATE1列和上个月匹配的记录

我曾尝试使用标准having子句语法编写此文档,但这不起作用,因此我能够使用CTE获得预期的结果。这个解决方案应该适用于我正在尝试做的事情,但我更想理解为什么HAVING子句不起作用。在这些示例中,MAX(DATE1)=2018-02-28

询问我是否期望工作

select
    ID,
    sum(money) as money,
    date1
from
    table1
group by
    ID,
    date1
having
    date1 between add_months(max(date1),-1) and max(date1)
这将返回与此类似的结果集

| ID | Money | date1      |
|----|-------|------------|
| 1  | 50    | 2017-12-31 |
| 2  | 600   | 2018-01-31 |
| 3  | 200   | 2018-02-28 |
此查询使用CTE返回预期的结果集

with period as (
    select
        max(date1) as maxdate1,
        add_months(max(date1),-1) as priordate1
    from
        table1 

select
    id,
    sum(money),
    date1
from
    table1
join period on
    1 = 1
where
    date1 between priordate1 and maxdate1
group by
    id,
    date1
| ID | Money | date1      |
|----|-------|------------|
| 1  | 50    | 2018-02-28 |
| 2  | 600   | 2018-01-31 |
| 3  | 200   | 2018-02-28 |
预期结果集

with period as (
    select
        max(date1) as maxdate1,
        add_months(max(date1),-1) as priordate1
    from
        table1 

select
    id,
    sum(money),
    date1
from
    table1
join period on
    1 = 1
where
    date1 between priordate1 and maxdate1
group by
    id,
    date1
| ID | Money | date1      |
|----|-------|------------|
| 1  | 50    | 2018-02-28 |
| 2  | 600   | 2018-01-31 |
| 3  | 200   | 2018-02-28 |

您的代码不起作用,因为
date1
组中。您可以使用窗口函数来避免加入

select id, sum(money), maxdate1
from (select t1.*, max(date1) over () as maxdate1
      from table1 t1
     ) t1
where date1 between add_months(maxdate1, -1) and maxdate1
group by id, maxdate1

您正在按
date1
进行聚合,因此
max(date1)
是行中的值。谢谢,这解释了为什么我的第一个查询没有按预期工作。它只返回maxdate1。我认为它返回了所有正确的记录,其中date1是max date和上个月,但它显示了所有结果的max date。我将更多地摆弄它,因为这是一个比我加入1=1的CTE更好的解决方案,如果我能让它工作的话。