首页 > 解决方案 > 选择分组依据之外的列

问题描述

我希望按每个 ID 选择第一次和最后一次点击,以及相应的来源。这是一个示例表:

ID   Click      Source  
--------------------------
1      1        Google  
1      2        Facebook   
1      3        Yahoo   
2      1        Google
2      2        Yahoo 
3      1        Facebook
4      1        Yahoo
5      1        Pinterest
5      2        Google

这是期望的结果:

ID   First      Last
-------------------------
1    Google     Yahoo
2    Google     Yahoo
3    Facebook   Facebook
4    Yahoo      Yahoo
5    Pinterest  Google

我已经通过在 where 子句中简单地设置 click=1 来获得第一次点击。如果不按 ID 和来源分组,我无法获得 MAX(点击)。当我将 Source 包含在 group by 中时,我没有得到我想要的结果。

标签: postgresql

解决方案


DISTINCT ON您可以使用公共 ID连接两个派生表,以获取每个 ID 的第一次和最后一次点击。

SELECT f.id,
       f.source "first",
       s.source "last"
       FROM (SELECT DISTINCT ON (id)
                    id,
                    source
                    FROM elbat
                    ORDER BY id ASC,
                             click ASC) f
            INNER JOIN (SELECT DISTINCT ON (id)
                               id,
                               source
                               FROM elbat
                                    ORDER BY id ASC,
                                             click DESC) s
                       ON s.id = f.id;

db<>小提琴


推荐阅读