Postgresql 选择分组依据之外的列
我希望通过每个ID选择第一次和最后一次单击,以及相应的源。下面是一个示例表: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 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;