从特定列中查找最大值,然后按它们分组

Find maximum value from specific column and group by them after that

我有一个 table 这样的:

p_id | store |      createdat      | device  | deviceserial | application
------+-------+---------------------+---------+--------------+-------------
      | z10   | 2020-09-02 08:02:39 | android | 636363636890 | app-a
      | z10   | 2020-09-02 08:08:18 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 08:10:10 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 08:20:10 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 10:40:11 | IOS     | 6625839827   | app-b
      | z10   | 2020-09-02 10:45:11 | IOS     | 6625839827   | app-b
      | z10   | 2020-09-02 10:50:11 | IOS     | 6625839827   | app-b
      | z11   | 2020-09-02 08:47:10 | Android | 636363636891 | app-a
      | z11   | 2020-09-02 08:55:10 | Android | 636363636891 | app-a
      | z11   | 2020-09-02 08:59:10 | Android | 636363636891 | app-a
      | z11   | 2020-09-02 13:01:11 | IOS     | 6625839828   | app-b
      | z11   | 2020-09-02 13:15:11 | IOS     | 6625839828   | app-b
      | z10   | 2020-09-02 12:03:10 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 12:09:10 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 12:12:10 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 15:15:11 | IOS     | 6625839827   | app-b
      | z10   | 2020-09-02 15:20:11 | IOS     | 6625839827   | app-b
      | z11   | 2020-09-02 10:25:10 | Android | 636363636891 | app-a
      | z11   | 2020-09-02 10:35:10 | Android | 636363636891 | app-a
      | z11   | 2020-09-02 16:39:11 | IOS     | 6625839828   | app-b

我想按此记录分组 hourly.Then 在一小时内从商店 z-10 和 z-11 中找到 app-a 和 app-b 的最大事件 (event_counts) 值.实际上会有更多商店,applications.I 尝试使用此查询:

select distinct on (application) 
    application,
    count(*) as event_count,
    date_trunc('hour', createdat) as hr,store
from devices  
group by application,hr, store
order by application, event_count desc

这就是我的结果:

application  | event_count |         hr             store
--------------+-------------+---------------------+---------------------
 app-a       |           4 | 2020-09-02 08:00:00 |z10
 app-b       |           3 | 2020-09-02 10:00:00 |z10

我想达到这个结果:

application  | event_count |         hr             store
--------------+-------------+---------------------+---------------------
 app-a       |           4 | 2020-09-02 08:00:00 |z10
 app-b       |           3 | 2020-09-02 10:00:00 |z10
 app-a       |           3 | 2020-09-02 08:00:00 |z11
 app-b       |           2 | 2020-09-02 13:00:00 |z11
 

如果您想要每个 application/store 元组的高峰时间,您可以像这样使用 distinct on

select distinct on (application, store) 
    application, store,
    count(*) as event_count,
    date_trunc('hour', createdat) as hr
from mytable  
group by application, store, hr
order by application, store, event_count desc

Demo on DB Fiddle:

application | store | event_count | hr                 
:---------- | :---- | ----------: | :------------------
app-a       | z10   |           4 | 2020-09-02 08:00:00
app-a       | z11   |           3 | 2020-09-02 08:00:00
app-b       | z10   |           3 | 2020-09-02 10:00:00
app-b       | z11   |           2 | 2020-09-02 13:00:00