【问题标题】:Average value along with 5 top maximum values for each record每条记录的平均值以及 5 个最高最大值
【发布时间】:2019-07-09 15:25:02
【问题描述】:

对于这个示例数据:

First Name | Last Name | Count | datetime
----------------------------------------------------
John       | Mac       | 5     | 2019-07-09 01:00:01
Drew       | G         | 6     | 2019-07-09 01:01:01
John       | Mac       | 10    | 2019-07-09 01:11:01
John       | Mac       | 15    | 2019-07-09 01:12:01
John       | Mac       | 16    | 2019-07-09 01:13:01
John       | Mac       | 2     | 2019-07-09 01:14:01
Drew       | G         | 16    | 2019-07-09 01:03:01
Drew       | G         | 26    | 2019-07-09 01:08:01
Drew       | G         | 8     | 2019-07-09 02:01:01
Drew       | G         | 10    | 2019-07-09 05:01:01
Drew       | G         | 11    | 2019-07-09 08:01:01

我可以使用此查询来获取按日期分组的每个人的平均人数:

SELECT firstname, lastname, date(datetime), avg(count)
from table
where date(datetime) between '2019-07-08' and '2019-07-08'
group by firstname, lastname, date(datetime)

如何编写查询以包含每个(姓名、日期)组合的五个最高计数?我想产生如下输出:

First Name | Last Name | Avg_count| date       | max1 | max1_datetime       |  max2 | max2_datetime       | max 3 | max3_datetime       | max4 | max4_datetime       | max5 |max5_ datetime
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
John       | mac       | 9        | 2019-07-09 | 16   | 2019-07-09 01:13:01 | 15     | 2019-07-09 01:12:01 | 10    | 2019-07-09 01:11:01 | 5    | 2019-07-09 01:00:01 | 2    | 2019-07-09 01:14:01

【问题讨论】:

  • "...对于每条记录..." -- 什么意思?
  • 可读性修复和澄清问题。

标签: sql database db2


【解决方案1】:

您可以使用条件聚合:

select firstname, lastname, date(datetime), avg(count),
       max(case when seqnum = 1 then count end) as count_1,
       max(case when seqnum = 1 then datetime end) as datetime_1,
       max(case when seqnum = 2 then count end) as count_2,
       max(case when seqnum = 2 then datetime end) as datetime_2,
       max(case when seqnum = 3 then count end) as count_3,
       max(case when seqnum = 3 then datetime end) as datetime_3,
       max(case when seqnum = 4 then count end) as count_4,
       max(case when seqnum = 4 then datetime end) as datetime_4,
       max(case when seqnum = 5 then count end) as count_5,
       max(case when seqnum = 5 then datetime end) as datetime_5
from (select t.*,
             row_number() over (partition by firstname, lastname, date(datetime) order by count desc) as seqnum
      from table t
      where datetime >= '2019-07-08' and
            datetime < '2019-07-09'
     ) t
group by firstname, lastname, date(datetime);

请注意,我也更改了日期比较。这使得它更适合使用索引。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 2021-11-20
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
相关资源
最近更新 更多