MySQL窗口函数中的Group by或Distinct

kognpnkq  于 2023-10-15  发布在  Mysql
关注(0)|答案(2)|浏览(142)

这里有一个简单的问题,但我想知道是否有人可以告诉我窗口函数中的distinct和group by背后的机制。
我读了几篇文章,但没有得到任何与我的怀疑有关的。
以下是我的问题:
关于以下输入/输出:enter image description here
这是通过以下SQL查询得到的:

select
player_id
, first_value(event_date) over(partition by player_id order by event_date) as first_login
from Activity
group by player_id

我知道它可以通过简单的聚合来解决,不要误解我。我只是想知道为什么“group by”在这个问题上似乎不起作用,而“distinct”可以起作用并通过测试。先谢谢你了。

select
DISTINCT player_id
, first_value(event_date) over(partition by player_id order by event_date) as first_login
from Activity

如果我使用cute或subquery,那么“group by”就可以了:

select
*
from
(select
player_id
, first_value(event_date) over(partition by player_id order by event_date) as first_login
from Activity) as cte
group by player_id, first_login

伪数据

WITH 
Activity AS (
    SELECT 1 AS player_id, 2 AS device_id, '2016-03-01' AS event_date, 5 AS games_played UNION ALL
    SELECT 1, 2, '2016-05-02', 6 UNION ALL
    SELECT 1, 3, '2015-06-25', 1 UNION ALL
    SELECT 3, 1, '2016-03-02', 0 UNION ALL
    SELECT 3, 4, '2016-02-03', 5 )
0g0grzrc

0g0grzrc1#

对查询之间差异的解释是,操作有一个顺序。

  1. GROUP BY将行减少为分组列(player_id)中每个值一行。在您的示例中,这会导致错误的值'2016-03-01',它不是最小值,它只是执行期间读取的第一行中的值。这个错误是因为你没有使用sql_mode=ONLY_FULL_GROUP_BY
    1.窗口函数应用于聚合后的行。如果使用按与分组列相同的列进行分区的窗口函数,则分区定义为单行。
  2. DISTINCT在窗口函数之后应用,将行减少到具有唯一值组合的行。这将消除重复行。
ghhkc1vu

ghhkc1vu2#

SELECT player_id
     , MIN(event_date) AS first_login
FROM activity
GROUP BY player_id

相关问题