我有一张这样的桌子:
Category Version
B 1.8.11
B 1.20.138
B 1.29.01
B 1.30.89
B 1.3.114
现在,我想获得最新版本。默认情况下,order by 不起作用,因为 1.8.11 被视为最高。
我知道一种方法是使用 split_part 和 substring 并获取最新版本,在这种情况下将是 1.30.89。
只是想了解是否有更好的方法来实现这一目标。
编辑1:
我正在使用 redshift postgresql。所以,并不是所有的 postgresql 函数都可用。
我想出的另一种方法是这样的。在这里,我将零填充到左侧,然后在报告实际版本之前必须删除它们。
(TO_CHAR(SPLIT_PART(version,'.',1),'fm000') + '.' + TO_CHAR(SPLIT_PART(version,'.',2),'fm000') + '.' + TO_CHAR((case when SPLIT_PART(version,'.',3) = '' then '0' else SPLIT_PART(version,'.',3) end),'fm000')) AS padded_version
EDIT2: 我有一个更好的方法。所以,在这里分享一下:
select category, version from
(SELECT CATEGORY,
VERSION,
ROW_NUMBER() OVER (PARTITION BY CATEGORY ORDER BY SPLIT_PART(VERSION,'.',1)::INT DESC,SPLIT_PART(VERSION,'.',2)::INT DESC),SPLIT_PART(VERSION,'.',3)::INT DESC)
from table1)
where row_number = 1
谢谢!