这里有一个简单的问题,但我想知道是否有人可以告诉我窗口函数中的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 )
2条答案
按热度按时间0g0grzrc1#
对查询之间差异的解释是,操作有一个顺序。
player_id
)中每个值一行。在您的示例中,这会导致错误的值'2016-03-01',它不是最小值,它只是执行期间读取的第一行中的值。这个错误是因为你没有使用sql_mode=ONLY_FULL_GROUP_BY
。1.窗口函数应用于聚合后的行。如果使用按与分组列相同的列进行分区的窗口函数,则分区定义为单行。
DISTINCT
在窗口函数之后应用,将行减少到具有唯一值组合的行。这将消除重复行。ghhkc1vu2#