2014-03-13 43 views
1

我有以下信息的表:
创建唯一的ID

CREATE TABLE TABLE1(
    col1 bigint, 
    col2 TIMESTAMP, 
    col3 integer 
) 

一些样本数据

28564635; "2014-03-11 07:02:16+03"; 51 
28564635; "2014-03-11 07:06:25+03"; 52 
28564635; "2014-03-11 07:13:38+03"; 53 
28564635; "2014-03-11 07:21:19+03"; 56 
28564636; "2014-03-11 07:01:16+03"; 31 
28564636; "2014-03-11 07:06:16+03"; 29 
28564636; "2014-03-11 07:37:16+03"; 30 
28564636; "2014-03-11 07:39:16+03"; 31 

值在col1和col2上整理升序。现在的要求是要追加基于所述条件中的端部的计算列:

  • 第一行给定id 1
  • 从行2开始,如果以前的行和当前COL2的电流COL1 = COL1 - 以前COL2 < 30则ID将是1(同排1)其他增量编号由1

所以输出会像

28564635; "2014-03-11 07:02:16+03"; 51; 1 
28564635; "2014-03-11 07:06:25+03"; 52; 1 
28564635; "2014-03-11 07:13:38+03"; 53; 1 
28564635; "2014-03-11 07:21:19+03"; 56; 1 
28564636; "2014-03-11 07:01:16+03"; 31; 2 
28564636; "2014-03-11 07:06:16+03"; 29; 2 
28564636; "2014-03-11 07:37:16+03"; 30; 3 
28564636; "2014-03-11 07:39:16+03"; 31; 3 

如何在不使用游标的情况下在SQL查询中实现这一点。

回答

2

SQLFiddle

数据:

-- drop table if exists table1; 

create table table1(
    col1 bigint, 
    col2 timestamp, 
    col3 integer 
); 

insert into table1 (col1, col2, col3) values 
    (28564635, '2014-03-11 07:02:16+03', 51), 
    (28564635, '2014-03-11 07:06:25+03', 52), 
    (28564635, '2014-03-11 07:13:38+03', 53), 
    (28564635, '2014-03-11 07:21:19+03', 56), 
    (28564636, '2014-03-11 07:01:16+03', 31), 
    (28564636, '2014-03-11 07:06:16+03', 29), 
    (28564636, '2014-03-11 07:37:16+03', 30), 
    (28564636, '2014-03-11 07:39:16+03', 31) 
; 

查询:

select 
    *, 
    sum(test) over (order by col1, col2) as rn 
from (
    select 
    *, 
    (not 
     coalesce(extract(epoch from col2 
     - lag(col2) over(partition by col1 order by col2))/60.0 < 30, false) 
    )::int as test 
    from 
    table1 
) a 

结果:

28564635;2014-03-11 07:02:16;51;1;1 
28564635;2014-03-11 07:06:25;52;0;1 
28564635;2014-03-11 07:13:38;53;0;1 
28564635;2014-03-11 07:21:19;56;0;1 
28564636;2014-03-11 07:01:16;31;1;2 
28564636;2014-03-11 07:06:16;29;0;2 
28564636;2014-03-11 07:37:16;30;1;3 
28564636;2014-03-11 07:39:16;31;0;3 

说明:

  1. 从以前col2找以前col2当前col1
  2. 。减去当前col2和计算的分钟数
  3. 测试它是否小于30分钟
  4. 合并结果到false(与没有以前col2行)
  5. 注:先前的意愿标志每第一行(由col1)和每行,其中差别> 30分钟内,false
  6. 否定一切 - 我们得到true所有行,我们想使计数器
  7. 演员布尔整数(true=1false=0
  8. 在外部查询计算运行我们的测试的总和,通过col1col2
  9. 有序
+0

感谢托马斯。奇迹般有效.. – user3135155