2017-04-25 39 views
1

我有分组PostgreSQL的OVER和GROUP

我有一个表(多了很多的东西在里面,但不相关)的问题,看起来像:

id user 
0 1 
1 1 
2 1 
3 2 
4 2 
5 2 
6 1 
7 1 

我想得到以下值:

user start end 
1 0 2 
2 3 5 
1 6 7 

Basicaly,我需要用户的第一次和最后一次发生,而不是乱序。 我知道我需要使用OVER(PARTITION BY ...),但我从来没有用过它,不知道如何构建这个查询。 如果我“按用户分区”,它会忽略顺序。如果我“通过ID分区,用户”它再次返回错误。

的是我的尝试(甚至没有设法得到我所需要的,但为表示我该怎么办呢,一旦我搞清楚“过度”部分的中点)

例子:

SELECT user, count(user) over (partition by user): 
user count 
1 5 
1 5 
1 5 
2 3 
2 3 
2 3 
1 5 
1 5 

SELECT user, count(user) over (partition by id, user): 
user count 
1 1 
1 1 
1 1 
2 1 
2 1 
2 1 
1 1 
1 1 
+0

'SELECT用户分钟(ID)在(用户分区),MAX(ID)在(用户分区)'?.. –

回答

4

使用的行数做法的不同与相同的用户连续行分为一组,并开始了一个新的组时,遇到新用户。之后,使用group by来获取每个组的开始和结束。

SELECT USER,MIN(ID) AS START,MAX(ID) AS END 
FROM (SELECT user,id, row_number() over(order by id) 
        - row_number() over (partition by user order by id) as grp 
     FROM tablename 
    ) T 
GROUP BY USER,GRP 
+0

这是一个经过测试的OP链接:http://rextester.com/AAN86440 – pozs

+0

完美。谢谢:) – darthzejdr

+0

@pozs ..感谢编辑和rextester链接。 –

3

到拿到启动,ID的结束,请使用:

SELECT user, min(id) over (partition by user) "start", max(id) over (partition by user) "end" 
from table_name; 

更新 我的答案是基于错误的谓词和错。为了提供正确的而不是重复@vkp一个,我做了这个可怕的构造:

create table so74 as 
select * from (values (0, 1), (1, 1), (2, 1), (3, 2), (4, 2), (5, 2), (6, 1), (7, 1)) t(id, u); 

with d as (
    with c as (
     with b as (
      select 
       * 
       , case when lag(u) over (order by id) <> u or id = min(id) over() then id end min 
       , case when lead(u) over (order by id) <> u or id=max(id) over() then id end max 
      from so74 
      ) 
     select u, min,max 
     from b 
     where coalesce(min,max) is not null 
    ) 
    select u,min,lead(max) over() max 
    from c 
) 
select * 
from d 
where coalesce(min,max) is not null 
; 

u | min | max 
---+-----+----- 
1 | 0 | 2 
2 | 3 | 5 
1 | 6 | 7 
(3 rows) 

Time: 0.456 ms 
+1

我得到的最小和最大总这一点。不是分区数据... – darthzejdr

+0

说实话,我不明白你的问题,我只是建立了一个查询,会产生你想要的结果**我试图得到以下值:**。如果我失败,请更新问题 –

+0

问题是分区将返回每个用户的最小值和最大值。 – darthzejdr