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,第二个解决方案很好,一些澄清第二个解决方案很好,直到有列不包含相同的分隔符,这更好,谢谢:)