【问题标题】:Impala/SQL: Can I have different time-period for each group?Impala/SQL:我可以为每个组设置不同的时间段吗?
【发布时间】:2016-09-08 17:32:59
【问题描述】:

我有下表:

id   | timestamp  |  team  
----------------------------
1    | 2016-05-06 |  A
2    | 2016-03-02 |  A
3    | 2015-12-01 |  A
4    | 2016-07-05 |  B
5    | 2016-06-30 |  B
6    | 2016-06-28 |  B
7    | 2016-04-05 |  C
8    | 2016-04-02 |  C
9    | 2016-01-02 |  C

我想按团队分组并找到每个团队的最后一个时间戳,所以我做到了:

select team, max(timestamp) from my_table group by team

到目前为止一切正常。但是,现在我想知道每个团队最后一个月有多少不同的 id。例如,对于 A 队,从 2016-04-07 到 2016-05-06,因此计数为 1。对于 B 队,上个月是从 2016-06-06 到 2016-07-05,所以计数是 3。对于 C 队来说,最后一个月是从 2016-03-06 到 2016-04-05,计数是 2。我的预期输出应该如下所示:

team  | max(timestamp)  |  count_in_last_month
------------------------------------------------
A     | 2016-05-06      |  1
B     | 2016-07-05      |  3
C     | 2016-04-05      |  2

这可以使用 Impala 查询导出吗?谢谢!

【问题讨论】:

    标签: mysql impala


    【解决方案1】:

    将原始表与获得最大时间戳的子查询连接起来。

    SELECT t1.team, t2.month_end, COUNT(DISTINCT t1.id) AS count_in_last_month
    FROM my_table AS t1
    JOIN (SELECT team, MAX(timestamp) AS month_end
          FROM my_table
          GROUP BY team) AS t2
    ON t1.team = t2.team 
    AND t1.timestamp BETWEEN DATE_SUB(month_end, INTERVAL 1 MONTH) AND month_end
    GROUP BY t1.team, t2.month_end
    

    DEMO

    【讨论】:

    • 我收到以下错误:选择列表表达式不是由聚合输出生成的(缺少 GROUP BY 子句?):t2.month_end
    • 使用ANY_VALUE(t2.month_end) 禁用对该列的检查。见dev.mysql.com/doc/refman/5.7/en/…
    • 我得到:HiveServer2Error: AnalysisException: my_db.any_value() unknown。 Any_Value 也适用于黑斑羚吗?还是只有 SQL?
    • ANY_VALUE() 是 MySQL 5.7 中的一项新功能,他们在更改ONLY_FULL_GROUP_BY SQL 模式的默认值时添加了该功能。
    • 您也可以将t2.month_end 添加到GROUP BY 子句中。
    猜你喜欢
    • 2017-09-01
    • 2012-07-24
    • 2018-03-21
    • 1970-01-01
    • 2020-10-11
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多