如何使用postgresql根据同一组的值差异递减/递增值?

如何使用postgresql根据同一组的值差异递减/递增值?,sql,postgresql,Sql,Postgresql,我有如下表格。相同的no的每个val1和val2具有相同的值 no val1 val2 ------------------ "1" 289.4 289 "1" 289.4 289 "1" 289.4 289 "1" 289.4 289 "2" 13.2 13.6 "2" 13.2 13.6 "2" 13.2 13.6 "2" 13.2 13.6 "3" 181 181.2 "3" 181

我有如下表格。相同的
no
的每个
val1
val2
具有相同的值

no    val1    val2
------------------
"1"   289.4   289
"1"   289.4   289
"1"   289.4   289
"1"   289.4   289
"2"   13.2    13.6
"2"   13.2    13.6
"2"   13.2    13.6
"2"   13.2    13.6
"3"   181     181.2
"3"   181     181.2
我希望桌子像下面一样。相同
no
的行总数始终表示0.1刻度的差异。e、 g:4行相同的
no
=0.4差异,3行相同的
no
=0.3差异

如果
val1
val2
相同
no
:使用
val1
作为上限,使用
val2
作为下限,将值递减0.1,如下(
no
1)。
如果
val1
val2
相同
no
:使用
val1
作为下限,使用
val2
作为上限,将值增加0.1,如下所示(
no
2和3)


如何在postgresql中实现这一点?谢谢

您可以使用
CTE
为给定
no
的每组值分配行号,并计算用于每行的
diff
值;然后根据原始
val1
值、行号和
diff
计算新的
val1
val2
值:

WITH CTE AS (
  SELECT no, val1,
         ROW_NUMBER() OVER (PARTITION BY no ORDER BY NULL) AS rn,
         SIGN(val1 - val2) * 0.1 AS diff
  FROM data
)
SELECT no, 
       val1 - (rn - 1) * diff AS val1,
       val1 - rn * diff AS val2
FROM CTE
输出:

no      val1    val2
"1"     289.4   289.3
"1"     289.3   289.2
"1"     289.2   289.1
"1"     289.1   289
"2"     13.2    13.3
"2"     13.3    13.4
"2"     13.4    13.5
"2"     13.5    13.6
"3"     181     181.1
"3"     181.1   181.2

如果你有4行和0.3的差异怎么办?@Nick忘了提到,同一组的行总数总是代表0.1刻度的差异。4行=0.4差异,3行=0.3差异。确定。行的排序依据是否还有其他列?e、 g.
id
,或
时间戳
?@Nick在我的实际数据中还有其他col,但这并不重要。我只需要根据
no
colI设置值。我明白,问题是决定4个看起来相同的行中的哪一行分配给哪一组数字,例如,哪一行获得
289.3289.2
vs
289.4289.3
哇,答案比我预期的快,效果很好。非常聪明的技巧,使用
覆盖
分区
谢谢@别担心,我很高兴能帮上忙。
no      val1    val2
"1"     289.4   289.3
"1"     289.3   289.2
"1"     289.2   289.1
"1"     289.1   289
"2"     13.2    13.3
"2"     13.3    13.4
"2"     13.4    13.5
"2"     13.5    13.6
"3"     181     181.1
"3"     181.1   181.2