使用MAX的子句无法按我期望的那样在HIVE查询中工作

时间:2019-07-17 12:16:07

标签: sql hadoop hive hiveql

我正在尝试选择仅与表和上个月的最大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 |

1 个答案:

答案 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