Mysql 在这种情况下,为什么窗口函数返回不正确的结果?

Mysql 在这种情况下,为什么窗口函数返回不正确的结果?,mysql,sql,Mysql,Sql,我们有一个表作为blow,希望编写一个查询来返回每个玩家最早的事件日期 +--------------+---------+ | Column Name | Type | +--------------+---------+ | player_id | int | | event_date | date | +--------------+---------+ 下面这样的查询肯定有效: select player_id, min(event_da

我们有一个表作为blow,希望编写一个查询来返回每个玩家最早的事件日期

+--------------+---------+
| Column Name  | Type    | 
+--------------+---------+
| player_id    | int     |
| event_date   | date    |
+--------------+---------+
下面这样的查询肯定有效:

select player_id,
       min(event_date)  as first_login
from activity
group by player_id;
我想知道为什么使用窗口函数的查询不能给出正确的答案。对此有什么见解吗

  select player_id,
         min(event_date) over (partition by player_id) as first_login
  from activity
  group by player_id;

查询格式不正确,应返回错误,因为
事件\u日期
未被聚合函数包围,或在
组中被
包围

我不知道你想要什么。
分组依据的等价物为:

select distinct player_id,
        min(event_date) over (partition by player_id) as first_login
from activity;
但是,如果需要聚合,请使用聚合查询

如果要将窗口函数与聚合一起使用,下面是一个查询示例:

select player_id,
       min(event_date)  as first_login,
       min(min(event_date)) as first_ever_login
from activity
group by player_id;

请注意,聚合函数嵌套在窗口函数中。

我怀疑您正在使用MariaDB,因为在MySql 8.0+中,您的第二个查询甚至不会运行。
如果你只是跑:

select player_id, event_date
from activity
group by player_id;
尽管该查询在逻辑上没有意义,在大多数数据库中都会失败,但MariaDB允许该查询,并为
event\u date
返回一个未定义的值,该值可能是每个
player\u id
的第一行的值
如果随后应用
MIN()
窗口函数:

min(event_date) over (partition by player_id)
MIN()

当在语句中使用
GROUP BY
子句时,窗口函数不应取代通常的聚合函数。
在这种情况下,他们只能对聚合结果进行操作