当前位置:   article > 正文

SQL取出累计值与1000相差最小差值的id【滴滴面试】--HiveSQL面试题27_用一个sql取出累计与1000相差最小值的id

用一个sql取出累计与1000相差最小值的id

目录

0 需求分析

1 数据准备

2 数据分析

3 小 结


0 需求分析

问题: table1(id:自增id,money:费用)问题:按id顺序累加money,取出累计值与1000相差绝对值最小差值的id。

表如下:

idmoney
1100
2300
3500
4700
5200
6400
7500
8700
9900
10100
11400
12700

1 数据准备

(1)数据

vim money.txt

  1. 1 100
  2. 2 300
  3. 3 500
  4. 4 700
  5. 5 200
  6. 6 400
  7. 7 500
  8. 8 700
  9. 9 900
  10. 10 100
  11. 11 400
  12. 12 700

(2) 建表

  1. create table if not exists money(
  2. id string,
  3. money string
  4. )
  5. row format delimited
  6. fields terminated by '\t'
  7. ;

(3) 加载数据

load data local inpath "/home/centos/dan_test/money.txt" into table money;

(4) 查询数据

  1. hive> select * from money;
  2. OK
  3. 1 100
  4. 2 300
  5. 3 500
  6. 4 700
  7. 5 200
  8. 6 400
  9. 7 500
  10. 8 700
  11. 9 900
  12. 10 100
  13. 11 400
  14. 12 700
  15. Time taken: 0.176 seconds, Fetched: 12 row(s)

2 数据分析

目标:按id顺序累加money,取出累计值与1000相差绝对值最小差值的id。

  • (1)按id顺序累加money,比较好计算。sum(money) over(order by id)
  •   (2)  取出累计值与1000的差值:abs(sum(money) over(order by id)  -1000) as diff
  •   (3) 按差值升序排序,取出第一个即可:first_value(id) (order by diff)

整体SQL如下:

  1. select first_value(id) over(order by diff)
  2. from(
  3. select id
  4. ,abs(sum(money) over(order by id) - 1000) as diff
  5. from money
  6. ) t
  7. limit 1

结果如下:

  1. --------------------------------------------------------------------------------
  2. OK
  3. 12
  4. Time taken: 13.518 seconds, Fetched: 1 row(s)

另一种写法:

  1. select *
  2. from(
  3. select id
  4. ,money
  5. ,diff
  6. ,dense_rank() over(order by diff) as dr
  7. from(
  8. select id
  9. ,money
  10. ,abs(sum(money) over(order by id) - 1000) as diff
  11. from money
  12. ) t
  13. ) m
  14. where dr=1

结果如下:

  1. --------------------------------------------------------------------------------
  2. OK
  3. 12 700 300.0 1
  4. Time taken: 10.546 seconds, Fetched: 1 row(s)

3 小 结

本题为滴滴面试题,难度中等,具体考察知识点如下:

  • (1)累积求和问题
  • (2)first_value()函数的使用注意去重
  • (3)dense_rank()排名函数的使用

欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/782000
推荐阅读
相关标签
  

闽ICP备14008679号