如何在PostgreSQL中标记列值的更改

时间:2019-05-17 04:58:39

标签: sql postgresql

PostgreSQL,版本11.3。我必须将数据从表导出到excel进行分析。我可以使用\ copy。有没有一种方法可以写选择,以便每当特定列中的值更改时,空白行就会出现?该列名为common_id。对于多个记录,这可以是相同的。我可以在该列上排序。但是我也想在导出为ex​​cel时标记值的变化。假设common_id中的值为1(对于3条记录),2(对于2条记录)和3(对于2条记录),输出将是
1
1
1

2
2

3
3

可以编写程序。但是想知道是否有可能直接在SQL中执行此操作。

1 个答案:

答案 0 :(得分:0)

这是一个解决方案,但这绝对不简单。

with data as (
    select * from (values (1), (1), (1), (2), (2), (3), (3)) v(a)
), changed_rows as (
    select a, 
           a - lag(a, 1)  OVER (ORDER BY a) as changed, 
          row_number() over (order by a) 
    from data
), with_nulls as (
    select a, 
           row_number 
    from changed_rows 
    union all 
    select null, 
           row_number 
    from changed_rows 
    where changed = 1 
    order by row_number, a nulls first
)
select a from with_nulls;
 a
---
 1
 1
 1

 2
 2

 3
 3
(9 rows)

基本思想是使用lag()找出数据更改的位置。 changed_rows CTE的输出如下所示:

 a | changed | row_number
---+---------+------------
 1 |         |          1
 1 |       0 |          2
 1 |       0 |          3
 2 |       1 |          4
 2 |       0 |          5
 3 |       1 |          6
 3 |       0 |          7
(7 rows)

我们从CTE中选择所有a列,然后将所有列都与null合并,其中row_number更改为1。如果我们首先对null进行排序,我们将得到答案。

编辑:简化了一点