微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql中使用distinct去重

select语法

[ WITH [ RECURSIVE ] with_query [,...] ]
SELECT [ ALL | disTINCT [ ON ( expression [,...] ) ] ]
    [ * | expression [ [ AS ] output_name ] [,...] ]
    [ FROM from_item [,...] ]
    [ WHERE condition ]
    [ GROUP BY grouping_element [,...] ]
    [ HAVING condition [,...] ]
    [ WINDOW window_name AS ( window_deFinition ) [,...] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL | disTINCT ] select ]
    [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FirsT | LAST } ] [,...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start [ ROW | ROWS ] ]
    [ FETCH { FirsT | NEXT } [ count ] { ROW | ROWS } ONLY ]
    [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF table_name [,...] ] [ NowAIT | SKIP LOCKED ] [...] ]

where from_item can be one of:

    [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [,...] ) ] ]
                [ TABLESAMPLE sampling_method ( argument [,...] ) [ REPEATABLE ( seed ) ] ]
    [ LAteraL ] ( select ) [ AS ] alias [ ( column_alias [,...] ) ]
    with_query_name [ [ AS ] alias [ ( column_alias [,...] ) ] ]
    [ LAteraL ] function_name ( [ argument [,...] ] )
                [ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [,...] ] ) [ AS ] alias ( column_deFinition [,...] )
    [ LAteraL ] function_name ( [ argument [,...] ] ) AS ( column_deFinition [,...] )
    [ LAteraL ] ROWS FROM( function_name ( [ argument [,...] ] ) [ AS ( column_deFinition [,...] ) ] [,...] )
                [ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [,...] ) ] ]
    from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [,...] ) ]

and grouping_element can be one of:

    ( )
    expression
    ( expression [,...] )
    ROLLUP ( { expression | ( expression [,...] ) } [,...] )
    CUBE ( { expression | ( expression [,...] )
    GROUPING SETS ( grouping_element [,...] )

and with_query is:

    with_query_name [ ( column_name [,...] ) ] AS ( select | values | insert | update | delete )

TABLE [ ONLY ] table_name [ * ]

数据

INSERT INTO "test_dist" VALUES (1,'1','a');
INSERT INTO "test_dist" VALUES (2,'b');
INSERT INTO "test_dist" VALUES (3,'c');
INSERT INTO "test_dist" VALUES (4,'2','m');
INSERT INTO "test_dist" VALUES (5,'n');
INSERT INTO "test_dist" VALUES (6,'3','j');
INSERT INTO "test_dist" VALUES (7,'j');
INSERT INTO "test_dist" VALUES (8,'4','j');

去重多个列

直接用distinct,后面的列都参与去重。只有code,name拼接的组合相同时,去掉重复的

# SELECT 
disTINCT code,name
from test_dist;
 code | name
------+------
 1    | b
 2    | n
 4    | j
 1    | c
 1    | a
 2    | m
 3    | j
(7 rows)

去重指定列,保留其他列

当下遇到需求,需要将其中一个列去重,然后其他列随机取出就可以了。造成这种需求的原因是单表设计不合理,没有拆分成多表,造成多字段冗余,除了唯一性标志外,其他字段是相同的。目标是,取出其他字段,忽略唯一标志。

因为其他字段有重复,需要去掉重复。

# SELECT 
disTINCT ON (code) code,id,name
from test_dist;
 code | id | name
------+----+------
 1    |  1 | a
 2    |  4 | m
 3    |  6 | j
 4    |  8 | j
(4 rows)

这里,根据code去重,id和name随机取出,这样可以获得code维度的数据。如果不去重,获得原始数据,code有重复。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐