postgresql查询小麻烦

tpgth1q7  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(2)|浏览(118)

有人能帮我在postgresql实现下面提到的要求。
输入表:

Col1 Col2 Col3 Col4
Jan   XXX  YYY  1234
Jan   XXX  YYY  5264
Jan   XXX  YYY  4736
Feb   ZZZ  WWW 123
Feb   ZZZ  WWW 456

输出文本文件:(定界)

Col1 Col2 Col3 Col4
Jan   XXX  YYY  1234
NULL NULL NULL  5264
NULL NULL NULL  4736
Feb   ZZZ  WWW 123
NULL NULL NULL 456

我想要像这个专栏一样

jmo0nnb3

jmo0nnb31#

您可以:

select
  case when rn = 1 then col1 end as col1,
  case when rn = 1 then col2 end as col2,
  case when rn = 1 then col3 end as col3,
  col4
from (
  select t.*, 
    row_number() over(partition by col1, col2, col3 order by col4) as rn
  from t
) x

但是,格式化应该在UI级别完成,而不是在查询级别。我强烈建议您在UI中完成。

vsmadaxz

vsmadaxz2#

要在PostgreSQL中获得所需的输出,您可以使用LAG函数比较当前行和前一行,并检查Col1、Col2和Col3的值是否相同。如果它们不同,则可以将Col2和Col3的值设置为NULL。
下面是一个示例查询,它应该可以获得所需的输出:

SELECT
  CASE
    WHEN Col1 = LAG(Col1) OVER (ORDER BY Col1, Col4)
      AND Col2 = LAG(Col2) OVER (ORDER BY Col1, Col4)
      AND Col3 = LAG(Col3) OVER (ORDER BY Col1, Col4)
    THEN NULL
    ELSE Col1
  END AS Col1,
  CASE
    WHEN Col1 = LAG(Col1) OVER (ORDER BY Col1, Col4)
      AND Col2 = LAG(Col2) OVER (ORDER BY Col1, Col4)
      AND Col3 = LAG(Col3) OVER (ORDER BY Col1, Col4)
    THEN NULL
    ELSE Col2
  END AS Col2,
  CASE
    WHEN Col1 = LAG(Col1) OVER (ORDER BY Col1, Col4)
      AND Col2 = LAG(Col2) OVER (ORDER BY Col1, Col4)
      AND Col3 = LAG(Col3) OVER (ORDER BY Col1, Col4)
    THEN NULL
    ELSE Col3
  END AS Col3,
  Col4
FROM InputTable
ORDER BY Col1, Col4;

在此查询中,LAG函数用于按Col1和Col4的顺序将当前行与前一行进行比较。如果Col1、Col2和Col3的值与前一行相同,则将NULL值赋给Col2和Col3。否则,将按原样返回Col1、Col2、Col3和Col4的值。
这将以您指定的格式给予所需的输出。

相关问题