Postgresql 选择分组依据之外的列

Postgresql 选择分组依据之外的列,postgresql,Postgresql,我希望通过每个ID选择第一次和最后一次单击,以及相应的源。下面是一个示例表: ID Click Source -------------------------- 1 1 Google 1 2 Facebook 1 3 Yahoo 2 1 Google 2 2 Yahoo 3 1 Facebook 4 1

我希望通过每个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(单击)。当我将源代码包括在组中时,我没有得到我想要的结果。

您可以使用公共id上的
DISTINCT ON
连接两个派生表,获得每个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;

sticky bit的解决方案相当不错,但您也可以使用窗口功能来实现这一点。您应该进行测试,看看哪一个更适合您:

select distinct id, 
       first_value(source) OVER (partition by id order by click),
       last_value(source)  OVER (partition by id order by click 
                                RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM your_table
ORDER BY id;