如何使用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
vs289.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