题目来源:滴滴
1 题目
已知有表 t_cost_detail 包含 id 和 money 两列,id 为自增,请累加计算money 值,并求出累加值与 1000 差值最小的记录。
+-----+--------+
| id | money |
+-----+--------+
| 1 | 200 |
| 2 | 300 |
| 3 | 200 |
| 4 | 100 |
| 5 | 150 |
| 6 | 80 |
| 7 | 100 |
| 8 | 200 |
+-----+--------+
样例结果
+-----+--------+
| id | money |
+-----+--------+
| 6 | 80 |
+-----+--------+
2 建表语句
CREATE TABLE IF NOT EXISTS t_cost_detail (
id bigint, --id
money bigint -- money
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS ORC;
insert into t_cost_detail(id, money) values
(1,200),
(2,300),
(3,200),
(4,100),
(5,150),
(6,80),
(7,100),
(8,200);
3 题解
select
id,
money
from
(
select
id,
money,
row_number()over(order by abs_diff) as rn
from
(
select
id,
money,
sum(money) over(order by id) as sum_money,
abs(sum(money) over(order by id)-1000) as abs_diff
from t_cost_detail
) t
) tt
where rn = 1;