2016-10-28 48 views
0

有没有办法从一个表中获得每个记录的列身体=“嘿”与下两个记录谁拥有相同的“dest “?但是,每当同一个目标在body =“嘿”中得到时,我需要这条记录,而后面的两条记录再次匹配相同的目标。SQL(PostgreSQL):选择Rows等于下列两个记录匹配相同的密钥

一个分区不帮我,因为我不能“重置”它的下一对结果谁拥有相同的目标和身体=“嘿”。

id | dest | body | received 
1 | A | Hey | 2016-10-28 01:00:00 
5 | B | Hey | 2016-10-28 02:00:00 
6 | B | X11 | 2016-10-28 03:00:00 
8 | A | Y11 | 2016-10-28 04:00:00 
11 | A | Y12 | 2016-10-28 05:00:00 
20 | C | Hey | 2016-10-28 06:00:00 
22 | A | Y13 | 2016-10-28 07:00:00 
25 | B | X12 | 2016-10-28 08:00:00 
26 | A | Hey | 2016-10-28 09:00:00 ! same "dest", if body = "Hey" we need it 
29 | A | Y22 | 2016-10-28 10:00:00 
33 | B | X13 | 2016-10-28 11:00:00 
35 | A | Y33 | 2016-10-28 12:00:00 

结果:

1 | A | Hey | 2016-10-28 01:00:00 
8 | A | Y11 | 2016-10-28 04:00:00 
11 | A | Y12 | 2016-10-28 05:00:00 
5 | B | Hey | 2016-10-28 02:00:00 
6 | B | X11 | 2016-10-28 03:00:00 
20 | B | X12 | 2016-10-28 08:00:00 
20 | C | Hey | 2016-10-28 06:00:00 
26 | A | Hey | 2016-10-28 09:00:00 
29 | A | Y22 | 2016-10-28 10:00:00 
35 | A | Y33 | 2016-10-28 12:00:00 
... 
+0

在未来2相同的'dest'记录也有什么happense'Hey'? – Nikhil

+0

@Nikhil它们应该显示在结果集中 – nenad007

回答

1
select id, dest, body, received 
from (
    select 
     *, 
     row_number() over (partition by dest, part) rn 
    from (
     select 
      *, 
      sum((body = 'Hey')::int) over (partition by dest order by id) part 
     from a_table 
     ) s 
    ) s 
where rn < 4 
order by dest, id; 

id | dest | body |  received  
----+------+------+--------------------- 
    1 | A | Hey | 2016-10-28 01:00:00 
    8 | A | Y11 | 2016-10-28 04:00:00 
11 | A | Y12 | 2016-10-28 05:00:00 
26 | A | Hey | 2016-10-28 09:00:00 
29 | A | Y22 | 2016-10-28 10:00:00 
35 | A | Y33 | 2016-10-28 12:00:00 
    5 | B | Hey | 2016-10-28 02:00:00 
    6 | B | X11 | 2016-10-28 03:00:00 
25 | B | X12 | 2016-10-28 08:00:00 
20 | C | Hey | 2016-10-28 06:00:00 
(10 rows) 
相关问题