db2 基于最近日期和时间与表的Sql联接

m1m5dgzv  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(221)

我想编写一个SQL查询,该查询连接两个表,在这两个表中,我可以看到驾驶员姓名和最近路线的目的地、到达日期和到达时间。
drivers
| 驱动程序编号|姓名|家|
| - -|- -|- -|
| 一个|鲍勃|哥伦布|
routes
| 驱动程序编号|目的地|到达日期|到达时间|
| - -|- -|- -|- -|
| 一个|哥伦布|小行星1220825|一千二百|
| 一个|印第安纳波利斯|小行星1220825|一八零零年|
| 一个|哥伦布|小行星1220826|千元|
| 一个|印第安纳波利斯|小行星1220826|一千二百|
一个驾驶员可以在一天内被分配到多条路线。
因此,我想要的查询会传回:
| 驱动程序编号|姓名|目的地|到达日期|到达时间|
| - -|- -|- -|- -|- -|
| 一个|鲍勃|印第安纳波利斯|小行星1220826|一千二百|
我尝试了不同的连接和子选择,但是我没有尝试将行程数据限制到最近的路线。这是我目前得到的最接近的路线,但是它不起作用,因为drivers.driver_num不在子选择的范围内:

  1. select
  2. driver_num,
  3. name,
  4. destination,
  5. arrived_date,
  6. arrived_time
  7. from drivers d
  8. join (
  9. select driver_num, destination, arrived_date, arrived_time
  10. from routes r
  11. where r.driver_num = d.driver_num
  12. order by arrived_date desc, arrived_time desc
  13. limit 1
  14. ) as most_resent_trip
  15. on r.driver_num = most_resent_trip.driver_num
  16. order by name desc;
pw9qyyiw

pw9qyyiw1#

我使用了row_number,以防您有多个驱动程序,并且希望在同一个表中显示所有驱动程序的结果。
我使用了SQL Server而不是DB2,但它非常简单,所以应该可以很好地翻译。

  1. select driver_num
  2. ,name
  3. ,destination
  4. ,arrived_date
  5. ,arrive_time
  6. from (
  7. select routes.driver_num
  8. ,routes.destination
  9. ,routes.arrived_date
  10. ,routes.arrive_time
  11. ,drivers.name
  12. ,row_number() over(partition by drivers.driver_num order by routes.arrived_date desc, routes.arrive_time desc) as rn
  13. from drivers join routes on routes.driver_num = drivers.driver_num
  14. where drivers.home <> routes.destination
  15. ) t
  16. where rn = 1

| 驱动程序编号|姓名|目的地|到达日期|到达时间|
| - -|- -|- -|- -|- -|
| 一个|鲍勃|印第安纳波利斯|小行星1220826|一千二百|
Fiddle

展开查看全部
taor4pac

taor4pac2#

LATERAL(或可使用TABLE子句代替)使用示例。

  1. /*
  2. WITH
  3. drivers (driver_num, name, home) AS
  4. (
  5. VALUES
  6. (1, 'Bob', 'Columbus')
  7. )
  8. , routes (driver_num, destination, arrived_date, arrive_time) AS
  9. (
  10. VALUES
  11. (1, 'Columbus', 1220825, 1200),
  12. (1, 'Indianapolis', 1220825, 1800),
  13. (1, 'Columbus', 1220826, 1000),
  14. (1, 'Indianapolis', 1220826, 1200)
  15. )
  16. * /
  17. SELECT
  18. r.driver_num
  19. , r.destination
  20. , r.arrived_date
  21. , r.arrive_time
  22. , d.name
  23. FROM drivers d
  24. CROSS JOIN LATERAL
  25. (
  26. SELECT
  27. r.driver_num
  28. , r.destination
  29. , r.arrived_date
  30. , r.arrive_time
  31. FROM routes r
  32. WHERE r.driver_num = d.driver_num
  33. ORDER BY r.arrived_date DESC, r.arrive_time DESC
  34. FETCH FIRST 1 ROW ONLY
  35. ) r

| 驱动程序_编号|目的地|到达日期|到达时间|名称|
| - -|- -|- -|- -|- -|
| 一个|印第安纳波利斯|小行星1220826|一千二百|鲍勃|

展开查看全部

相关问题