查询高频行的数据
query data for high-frequency rows
我是 SQL 的新手。我正在尝试按应用程序版本对数据进行分组,并且只显示每个操作系统的两个最流行的应用程序版本。
假设我有以下列:
- operating_system - varchar
- app_version - varchar
- start_time - 浮动
- 时间戳 - 时间戳
我可以执行以下操作以获取 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)
如果应用于您问题中的示例数据 - 输出为
我是 SQL 的新手。我正在尝试按应用程序版本对数据进行分组,并且只显示每个操作系统的两个最流行的应用程序版本。
假设我有以下列:
- operating_system - varchar
- app_version - varchar
- start_time - 浮动
- 时间戳 - 时间戳
我可以执行以下操作以获取 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)
如果应用于您问题中的示例数据 - 输出为