PostgreSQL语法

66 阅读2分钟

PostgreSQL碎碎念

前言

最近在做用户画像功能,对数据库中的用户数据进行分析,写了好多SQL,用到了很多PostgreSQL数据库中奇奇怪怪的语法,现在记录一下。

1、string_to_array结合unnest

适用于一个字段中存放多组数据,通过某个标识符(如",")分隔,但是想把这个数组数据分成多行展示的情况

SQL语句

unnest(string_to_array(字段, ',')) AS industry_id

如果字段为1,2,3,select 字段将会得到

1,2,3

使用SQL语句后将会得到

1
2
3

2、any

使用场景:用于结合场景1,解决一对多的外连接情况

t2.industry = ANY(string_to_array(t1.industry_classification, ','))

3、GREATEST与LEAST

使用场景:求几个数的最大值和最小值,和max,min这种聚合函数不一样,比如我画图的时候,原本的右边界为100,我用max聚合函数获取到到数据库中的最大值大于100,这时候要以这个最大值为准

GREATEST(n1,n2,n3,..........) 获取最大值  
LEAST(N1,N2,N3,N4,......) 获取最小值

4、generate_series

使用场景:生成递增序列,比如查看2020年至2025年的用户数据,但是某个用户2023年的数据可能会缺失,如果直接用现有的数据作为左表,统计完的坐标很可能成为2020 2021 2022 2024 2025,缺少了2023这个坐标。这就需要自己画一个年份序列

生成一个年份序列,看前10年的数据

SELECT generate_series(
(cast(EXTRACT(YEAR FROM CURRENT_DATE) as int) - 9),
cast(EXTRACT(YEAR FROM CURRENT_DATE) as int)) AS YEAR

5、DISTINCT ON

使用场景:比如我需要获取某个用户某年最新创建的数据

这里DISTINCT ON (year, user_id)表示获取元组为year,user_id开始的第一条数据,这里的元组必须经过排序,不然会报错,order by通过create_time倒序排列,就可以找到最新的数据

SELECT DISTINCT ON (year, user_id) *
FROM your_table
ORDER BY year, user_id, create_time DESC;

6、在字符串中包含数字,需要截取数字按照数字大小排序,不按照字典序排序

获取字符位置

position('-' in assess_no)

字符串截取

-- 从位置0截取到'-'出现的位置
substr(assess_no, 0, position('-' in assess_no))
-- 从位置'-'出现的位置截取到最后的位置
substr(assess_no, position('-' in assess_no) +1)