用pgsql将一列日期数据处理成一行数据,连续日期用下划线连接,不连续用逗号连接
时间: 2023-12-17 21:05:00 浏览: 167
可以使用 PostgreSQL 中的字符串聚合函数 string_agg(),以及日期函数 generate_series() 来实现此目的。具体步骤如下:
1. 构造一个包含所有日期的序列,使用 generate_series() 函数:
```
SELECT generate_series('2022-01-01'::date, '2022-01-10'::date, '1 day') AS date_series;
```
这将生成一个包含从 2022-01-01 到 2022-01-10 所有日期的序列。
2. 将日期序列与原表连接,使用 LEFT JOIN:
假设原表名为 my_table,日期列名为 date_col,则连接语句为:
```
SELECT date_series, date_col
FROM generate_series('2022-01-01'::date, '2022-01-10'::date, '1 day') AS date_series
LEFT JOIN my_table ON date_series = date_col;
```
3. 使用 CASE WHEN 子句将连续日期串联起来:
```
SELECT
string_agg(
CASE WHEN date_series - lag(date_series) OVER (ORDER BY date_series) = 1 THEN to_char(date_series, 'YYYY-MM-DD') ELSE '_' || to_char(date_series, 'YYYY-MM-DD') END,
''
) AS date_range
FROM (
SELECT date_series, date_col
FROM generate_series('2022-01-01'::date, '2022-01-10'::date, '1 day') AS date_series
LEFT JOIN my_table ON date_series = date_col
) t;
```
在上述查询中,使用了窗口函数 lag() 来判断当前日期是否与前一个日期连续,如果是,则直接输出日期,否则输出一个下划线和当前日期。最后使用 string_agg() 函数将结果进行字符串聚合,使得连续的日期被连接成一个字符串。
4. 对于不连续的日期,可以使用 COALESCE() 函数和逗号来连接:
```
SELECT
string_agg(
COALESCE(
CASE WHEN date_series - lag(date_series) OVER (ORDER BY date_series) = 1 THEN to_char(date_series, 'YYYY-MM-DD') ELSE '_' || to_char(date_series, 'YYYY-MM-DD') END,
''
),
','
) AS date_range
FROM (
SELECT date_series, date_col
FROM generate_series('2022-01-01'::date, '2022-01-10'::date, '1 day') AS date_series
LEFT JOIN my_table ON date_series = date_col
) t;
```
在字符串聚合函数中,使用逗号代替空字符串进行连接,即可将不连续的日期用逗号连接。
阅读全文