Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从组合字符串中获取组最大值_Sql_Postgresql_Aggregate_Greatest N Per Group_String Parsing - Fatal编程技术网

Sql 从组合字符串中获取组最大值

Sql 从组合字符串中获取组最大值,sql,postgresql,aggregate,greatest-n-per-group,string-parsing,Sql,Postgresql,Aggregate,Greatest N Per Group,String Parsing,我有一个表,其列code包含多个数据段,如下所示: 001/2017/TT/000001 001/2017/TT/000002 001/2017/TN/000003 001/2017/TN/000001 001/2017/TN/000002 001/2016/TT/000001 001/2016/TT/000002 001/2016/TT/000001 002/2016/TT/000002 SELECT max(substring(code, '([^/]*)$')) AS max_nr FR

我有一个表,其列
code
包含多个数据段,如下所示:

001/2017/TT/000001
001/2017/TT/000002
001/2017/TN/000003
001/2017/TN/000001
001/2017/TN/000002
001/2016/TT/000001
001/2016/TT/000002
001/2016/TT/000001
002/2016/TT/000002
SELECT max(substring(code, '([^/]*)$')) AS max_nr
FROM   tbl_bad
GROUP  BY substring(code, '^(.*)/');
001/2016/TT/000001
中有4个项目:
001
2016
TT
000001

如何提取前3项组成的每个组的最大值?我想要的结果是:

001/2017/TT/000003
001/2017/TN/000002
001/2016/TT/000002
002/2016/TT/000002
编辑

  • 子字段分隔符为
    /
    ,子字段的长度可以不同
  • 我使用PostgreSQL 9.3

使用
功能

SELECT MAX(RIGHT(code,6)) AS MAX_CODE
FROM yourtable
GROUP BY LEFT(code,12)

显然,您应该规范化表,并使用适当的数据类型将组合字符串拆分为4列。如果字符串中的分隔符
'/'
是常量,并且字符串的长度可以变化,则可以选择此函数

CREATE TABLE tbl_better AS 
SELECT split_part(code, '/', 1)::int AS col_1  -- better names?
     , split_part(code, '/', 2)::int AS col_2
     , split_part(code, '/', 3)      AS col_3  -- text?
     , split_part(code, '/', 4)::int AS col_4
FROM   tbl_bad
ORDER  BY 1,2,3,4  -- optionally cluster data.
那么任务就很简单了:

SELECT col_1, col_2, col_3, max(col_4) AS max_nr
FROM   tbl_better
GROUP  BY 1, 2, 3;
相关的:

当然,你也可以随时做。对于不同的子字段长度,可以使用如下正则表达式:

001/2017/TT/000001
001/2017/TT/000002
001/2017/TN/000003
001/2017/TN/000001
001/2017/TN/000002
001/2016/TT/000001
001/2016/TT/000002
001/2016/TT/000001
002/2016/TT/000002
SELECT max(substring(code, '([^/]*)$')) AS max_nr
FROM   tbl_bad
GROUP  BY substring(code, '^(.*)/');
相关(带有regexp模式的基本解释):

或仅获取完整字符串作为结果:

SELECT DISTINCT ON (substring(code, '^(.*)/'))
       code
FROM   tbl_bad
ORDER  BY substring(code, '^(.*)/'), code DESC;
关于上的不同


请注意,转换为适当类型的数据项的行为可能与其字符串表示形式不同。
900001
1000001
的最大值是
900001
对于
text
1000001
对于
integer

检查此项,可能的帮助信息

select 
distinct on (tab[4],tab[2]) tab[4],tab[3],tab[2],tab[1]
from
(
    select
    string_to_array(exe.x,'/') as tab,
    exe.x
    from
    (
        select
        unnest
            (
            array
            ['001/2017/TT/000001',
            '001/2017/TT/000002',
            '001/2017/TN/000003',
            '001/2017/TN/000001',
            '001/2017/TN/000002',
            '001/2016/TT/000001',
            '001/2016/TT/000002',
            '001/2016/TT/000001',
            '002/2016/TT/000002']
            ) as x
    ) exe
) exe2
order by tab[4] desc,tab[2] desc,tab[3] desc;

子字段长度是否恒定?或者只是分隔符“/”?不,只是一个分隔符
/
@erwinbrandstetter谢谢@Erwin Brandstetter我想这应该对我有帮助,我需要一些东西,我想选择所有代码
001/2017/TT/000003
将其插入另一个表中,您的查询只给我最后一部分
000003
@YCF\L:我添加了另一个解决方案。现在,由于
ORDER BY
中缺少
DESC
以获得max.hoho谢谢@Erwin Brandstetter,第二个解决方案很好,一些澄清第二个解决方案很好,直到有列不包含相同的分隔符,这更好,谢谢:)