首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择"step“记录

选择"step“记录
EN

Stack Overflow用户
提问于 2012-07-18 18:16:38
回答 3查看 501关注 0票数 3

给出下表

代码语言:javascript
复制
  grp |   ind |   val
----------------------
    a |     1 |     1
    a |     2 |     1
    a |     3 |     1
    a |     4 |     2
    a |     5 |     2
    a |     6 |     4
    a |     7 |     2
    b |     1 |     1
    b |     2 |     1
    b |     3 |     1
    b |     4 |     3
    b |     5 |     3
    b |     6 |     4

我需要选择以下内容:

代码语言:javascript
复制
  grp |   ind |   val
----------------------
    a |     1 |     1
    a |     4 |     2
    a |     6 |     4
    a |     7 |     2
    b |     1 |     1
    b |     4 |     3
    b |     6 |     4

也就是说,对于每个'grp',其中'val‘与前面的'val’不同的每个记录(按‘index’排序),所以每个'value‘处的记录都是“step”。

实现这一目标的最有效方法是什么?

谢谢。

以下是创建测试用例的脚本:

代码语言:javascript
复制
create temp table test_table
(
    grp character varying,
    ind numeric,
    val numeric
);
insert into test_table values
    ('a', 1 , 1),
    ('a', 2 , 1),
    ('a', 3 , 1),
    ('a', 4 , 2),
    ('a', 5 , 2),
    ('a', 6 , 4),
    ('a', 7 , 2),
    ('b', 1 , 1),
    ('b', 2 , 1),
    ('b', 3 , 1),
    ('b', 4 , 3),
    ('b', 5 , 3),
    ('b', 6 , 4);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-18 18:55:50

代码语言:javascript
复制
select grp,
       ind,
       val
from (
   select grp, 
          ind, 
          val,
          lag(val,1,0::numeric) over (partition by grp order by ind) - val as diff
   from test_table
) t
where diff <> 0;
票数 2
EN

Stack Overflow用户

发布于 2012-07-18 18:46:59

代码语言:javascript
复制
DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;

CREATE TABLE ztable
        ( zgroup CHAR(1)
        , zindex int
        , zvalue INTEGER
        );
INSERT INTO ztable(zgroup,zindex,zvalue) VALUES
    ('a',     1,      1)
    ,('a',     2,      1)
    ,('a',     3,      1)
    ,('a',     4,      2)
    ,('a',     5,      2)
    ,('a',     6,      4)
    ,('b',     1,      1)
    ,('b',     2,      1)
    ,('b',     3,      1)
    ,('b',     4,      3)
    ,('b',     5,      3)
    ,('b',     6,      4)
        ;

WITH agg AS (
        SELECT zgroup
        , zindex
        , zvalue
        , row_number() OVER (PARTITION BY zgroup ORDER BY zindex) AS zrank
        FROM ztable
        )
SELECT t1.zgroup,t1.zindex,t1.zvalue
FROM agg t1
LEFT JOIN agg t0 ON t0.zgroup = t1.zgroup AND 1+t0.zrank = t1.zrank
WHERE t0.zvalue <> t1.zvalue OR t0.zrank IS NULL
        ;
票数 2
EN

Stack Overflow用户

发布于 2012-07-18 18:31:27

代码语言:javascript
复制
select group,min(index) as index,value from table
group by group,value
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11539120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档