PostgreSQL,版本11.3。我必须将数据从表导出到excel进行分析。我可以使用\ copy。有没有一种方法可以写选择,以便每当特定列中的值更改时,空白行就会出现?该列名为common_id。对于多个记录,这可以是相同的。我可以在该列上排序。但是我也想在导出为excel时标记值的变化。假设common_id中的值为1(对于3条记录),2(对于2条记录)和3(对于2条记录),输出将是
1
1
1
2
2
3
3
可以编写程序。但是想知道是否有可能直接在SQL中执行此操作。
答案 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进行排序,我们将得到答案。
编辑:简化了一点