查询高频行的数据

query data for high-frequency rows

我是 SQL 的新手。我正在尝试按应用程序版本对数据进行分组,并且只显示每个操作系统的两个最流行的应用程序版本。

假设我有以下列:

我可以执行以下操作以获取 OS、应用版本和日期的平均开始时间,但我只想要该时间范围内的前两个或三个应用版本。

SELECT operation_system, app_version, DATE(timestamp) as date, AVG(start_time) as average_start_time
FROM ...
WHERE timestamp > timestamp_sub(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
GROUP BY operating_system, app_version, date
ORDER BY operating_system, app_version DESC, date

但我只想要每个 OS 的前两个应用程序版本,其中可能有几十个。我相信,使用 LIMIT 只会限制最终总数。有没有一种好方法可以让每个应用程序版本只获得最频繁的两三个?

这是一个没有时间戳的示例 table:

operating_system app_version start_time
Windows 1.23 7
Windows 1.22 9
OS X 7.0 4
Windows 1.22 16
Windows 1.23 8
Windows 1.21 4

这是一个示例响应,根据 OS:

获得前两个(按频率)应用程序版本
operating_system app_version average_start_time
Windows 1.23 7.5
Windows 1.22 12.5
OS X 7.0 4

在此示例中,省略了 Windows 1.21 的行,但因为它的行数少于 Windows 1.22 或 1.23。

下面使用

select * except(cnt) from (
  select operating_system, app_version, avg(start_time) average_start_time, count(*) cnt
  from your_table
  group by operating_system, app_version
)
qualify 2 >= row_number() over(partition by operating_system order by cnt desc)           

如果应用于您问题中的示例数据 - 输出为