Sql Having子句使用MAX不能像我在配置单元查询中预期的那样工作
我正在尝试选择仅与表中的max DATE1列和上个月匹配的记录 我曾尝试使用标准having子句语法编写此文档,但这不起作用,因此我能够使用CTE获得预期的结果。这个解决方案应该适用于我正在尝试做的事情,但我更想理解为什么HAVING子句不起作用。在这些示例中,MAX(DATE1)=2018-02-28 询问我是否期望工作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,
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更好的解决方案,如果我能让它工作的话。