向下舍入到N的倍数的最接近值

时间:2019-08-19 02:18:11

标签: sql postgresql rounding

我有如下的sql表

+-----------------------------+
| |col1 |  col2 | col3| col4| |
+-----------------------------+
| _______________________     |
| | a | 3   | d1 | 10 |       |
| | a | 6   | d2 | 15 |       |
| | b | 2   | d2 | 8  |       |
| | b | 30  | d1 | 50 |       |
+-----------------------------+

我想将上面的表格转换为下面的表格,其中 col4 = col4 - (col4 % min(col2) group by col1)

+------------------------------+
| |col1 |  col2 | col3| col4|  |
+------------------------------+
| ____________________________ |
| |a | 3   | d1 | 9  |         |
| |a | 6   | d2 | 15 |         |
| |b | 2   | d2 | 8  |         |
| |b | 30  | d1 | 50 |         |
|                              |
+------------------------------+

我可以在应用程序代码中阅读上表来手动进行转换,想知道是否有可能将转换卸载到sql

2 个答案:

答案 0 :(得分:1)

您可以使用多表UPDATE来实现所需的结果,将表连接到MIN(col2)值的表中:

UPDATE table1
SET col4 = col4 - (col4 % t2.col2min)
FROM (SELECT col1, MIN(col2) AS col2min
      FROM table1
      GROUP BY col1) t2 
WHERE table1.col1 = t2.col1

输出:

col1    col2    col3    col4
a       3       d1      9
a       6       d2      15
b       2       d2      8
b       30      d1      50

Demo on dbfiddle

答案 1 :(得分:1)

为此只需运行一个简单的select查询:

select col1, col2, col3,
       col4 - (col4 % min(col2) over (partition by col1))
from t;

不需要实际修改表。