我正在尝试选择仅与表和上个月的最大DATE1列匹配的记录。
我尝试使用标准的hading子句语法编写此代码,但这没有用,因此我可以使用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 |
答案 0 :(得分:1)
您的代码无效,因为date1
位于group by
中。您可以使用窗口函数来避免使用join
:
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