SQL- 计算比率并根据相应的用户和日期详细信息获得最大比率
SQL- calculate ratio and get max ratio with corresponding user and date details
我有一个 table,其中包含发送和接收消息的用户、日期和列:
我想按日期和用户获取 messages_sent/messages_recieved 的最大值。所以这是我期望的输出:
安德鲁·里恩 2020 年 10 月 2 日 10
安德鲁·哈普 2020 年 10 月 1 日 6
这是我的查询:
SELECT
ds.date, ds.user_name, max(ds.ratio) from
(select a.user_name, a.date, a.message_sent/ a.message_received as ratio
from messages a
group by a.user_name, a.date) ds
group by ds.date
但我得到的输出是:
安德鲁·里恩 2020 年 10 月 2 日 10
Jalinn 金 2020 年 10 月 1 日 6
在上面的输出中,6 是分组日期的正确最大比率,但用户错了。我做错了什么?
在这里,我只是计算第一个 CTE
中每一列的比率。
在第二部分中,我得到了在第一部分日期级别中计算的比率的最大结果。这意味着我假设每个用户每个日期都有一行。
date
级别的max()
函数将确保我们始终获得日期级别的最高比率。
比率之间可能存在联系,我们可以使用 ROW_NUMBER' OR
RANK()` 根据我们希望在联系的情况下通过的标准为每一行设置排名,然后根据生成的排名过滤。
with data as (
select
date,
user_id,
messages_sent / messages_recieved as ratio
from [table name]
)
select
date,
max(ratio) as higest_ratio_per_date
from data
group by 1,2
对于大多数数据库的最新版本,您可以执行类似的操作。
这假设与您的数据一样,每个用户每天一行。如果每个用户每天有更多行,则需要提供更多有关如何组合它们或忽略某些行的详细信息。你可能想要 SUM
他们。很难知道。
WITH cte AS (
select a.user_name, a.date
, a.message_sent / a.message_received AS ratio
, ROW_NUMBER() OVER (PARTITION BY a.date ORDER BY a.message_sent / a.message_received DESC) as rn
from messages a
)
SELECT t.user_name, t.date, t.ratio
FROM cte AS t
WHERE t.rn = 1
;
注意:没有尝试处理平局,即不止一个用户具有相同的比率。如果您的数据库支持,我们可以为此使用 RANK(或其他方法)。
我有一个 table,其中包含发送和接收消息的用户、日期和列:
我想按日期和用户获取 messages_sent/messages_recieved 的最大值。所以这是我期望的输出:
安德鲁·里恩 2020 年 10 月 2 日 10
安德鲁·哈普 2020 年 10 月 1 日 6
这是我的查询:
SELECT
ds.date, ds.user_name, max(ds.ratio) from
(select a.user_name, a.date, a.message_sent/ a.message_received as ratio
from messages a
group by a.user_name, a.date) ds
group by ds.date
但我得到的输出是:
安德鲁·里恩 2020 年 10 月 2 日 10
Jalinn 金 2020 年 10 月 1 日 6
在上面的输出中,6 是分组日期的正确最大比率,但用户错了。我做错了什么?
在这里,我只是计算第一个 CTE
中每一列的比率。
在第二部分中,我得到了在第一部分日期级别中计算的比率的最大结果。这意味着我假设每个用户每个日期都有一行。
date
级别的max()
函数将确保我们始终获得日期级别的最高比率。
比率之间可能存在联系,我们可以使用 ROW_NUMBER' OR
RANK()` 根据我们希望在联系的情况下通过的标准为每一行设置排名,然后根据生成的排名过滤。
with data as (
select
date,
user_id,
messages_sent / messages_recieved as ratio
from [table name]
)
select
date,
max(ratio) as higest_ratio_per_date
from data
group by 1,2
对于大多数数据库的最新版本,您可以执行类似的操作。
这假设与您的数据一样,每个用户每天一行。如果每个用户每天有更多行,则需要提供更多有关如何组合它们或忽略某些行的详细信息。你可能想要 SUM
他们。很难知道。
WITH cte AS (
select a.user_name, a.date
, a.message_sent / a.message_received AS ratio
, ROW_NUMBER() OVER (PARTITION BY a.date ORDER BY a.message_sent / a.message_received DESC) as rn
from messages a
)
SELECT t.user_name, t.date, t.ratio
FROM cte AS t
WHERE t.rn = 1
;
注意:没有尝试处理平局,即不止一个用户具有相同的比率。如果您的数据库支持,我们可以为此使用 RANK(或其他方法)。