如何获取日期的最大计数和相应的 hour_id?

Posted

技术标签:

【中文标题】如何获取日期的最大计数和相应的 hour_id?【英文标题】:how to get the max count and respective hour_id for a date? 【发布时间】:2015-06-02 12:00:41 【问题描述】:

以下是我尝试从中获取最大计数以及相应的 hour_id 和 id 值的源数据。日期应该只有一行,现在特定日期有多个值。

   id            hour_id    count   date
    621f50772a36e7  23      14474   20141202
    621f50157c2973  0       7190    20141203
    621f5077582f54  7       5043    20141225
    621f505247c107  11      5023    20141224
    621f50251c8b33  10      4943    20141224
    621f5076c9327b  18      4901    20150113
    621f50044c300e  10      4868    20141212
    621f500e10fa5d  12      4858    20141224
    621f505242ec27  9       4843    20141224
    621f505263bc56  14      4716    20141231
    621f50774a456c  19      4712    20141206
    621f5077414404  19      4674    20141123
    621f5077362f46  19      4666    20141224
    621f505246ea97  10      4662    20141225
    621f50522c6bf5  13      4626    20141226
    621f5076c87607  13      4586    20141231
    621f5052297007  17      4574    20141224

我已经试过了:

select max(count) cc
,partition_date
,location_id
,hour_id 
from 
(
     select 
     l.location_id
     , substr(x.evt_timestamp,9,2) as hour_id
     , count(1) as count 
     ,partition_date
     from prismeventdetails x
     join l_cellsite_location l
     on x.evt_location = l.location_id
     where x.evt_type = '100'           
     group by l.location_id
     ,hour_id 
     ,partition_date
     order by  cc desc  limit 500
) c 
group by partition_date,location_id,hour_id

但无法得到想要的结果。 为一个日期获取多行。因为我已将 hour_id 包含在 group by .我想要 hour_id 和 id 值,其中 count 是该 date 的最大值。需要帮助,我们将不胜感激。

【问题讨论】:

为什么这个标签是黑斑羚? 我正在使用 Impala sql 引擎 您使用的是哪个版本的 Impala? 我正在使用 Impala 1.2.1 。 我的回答能解决你的问题吗? 【参考方案1】:

以下是 GROUPed 和 MAXed 表与原始表的连接,应该得到你想要的。

WITH maxed AS
(
  SELECT max(count) AS max_count, date_
  FROM tests.so_30595512
  GROUP BY date_
)

SELECT maxed.date_, maxed.max_count, t2.hour, t2.id
FROM maxed
JOIN tests.so_30595512 AS t2
ON maxed.date_ = t2.date_
AND maxed.max_count = t2.count;

这是对您上面概述的表的查询,但同样的方法可以轻松转换为您在示例查询中使用的任何连接表。

【讨论】:

【参考方案2】:

尝试将 MAX 移动到子查询中:

select counts cc
,partition_date
,location_id
,hour_id 
from 
(
     select 
     l.location_id
     , substr(x.evt_timestamp,9,2) as hour_id
     , max(count(1)) as counts 
     ,partition_date
     from prismeventdetails x
     join l_cellsite_location l
     on x.evt_location = l.location_id
     where x.evt_type = '100'           
     group by partition_date, location_id, hour_id
     order by  cc desc  limit 500
)c

【讨论】:

请注意,这使得外部查询变得不必要(这是一件好事) 收到此错误:AnalysisException:聚合函数不能包含聚合参数:MAX(COUNT(1))【参考方案3】:
try this one:

select [count] cc
,partition_date
,location_id
,hour_id 
from 
(
     select 
     l.location_id
     , substr(x.evt_timestamp,9,2) as hour_id
     , count(1) as [count] 
     ,partition_date
     from prismeventdetails x
     join l_cellsite_location l
     on x.evt_location = l.location_id
     where x.evt_type = '100'           
     group by l.location_id
     ,hour_id 
     ,partition_date
,ROW_NUMBER() over (ORDER BY [count] DESC) AS Number
     order by  cc desc  limit 500
) c 
WHERE Number = 1
group by partition_date,location_id,hour_id

【讨论】:

我使用的 Impala 版本不支持窗口函数。

以上是关于如何获取日期的最大计数和相应的 hour_id?的主要内容,如果未能解决你的问题,请参考以下文章

用于获取不同日期以及唯一计数最大值的大查询

如何使用 SQL 获取计数和百分比?

我如何创建一个可以倒计时到给定时间和日期的计数器?

SOA 转换中的 XSLT 映射以获取上个月的最大日期

如何在日期时间 Python 中获取值计数

如何从计数中选择具有最大产生值的行