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

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

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

select 
    driver_num,
    name,
    destination,
    arrived_date,
    arrived_time
from drivers d
join (
  select driver_num, destination, arrived_date, arrived_time
  from routes r
  where r.driver_num = d.driver_num
  order by arrived_date desc, arrived_time desc
  limit 1
) as most_resent_trip
on r.driver_num = most_resent_trip.driver_num
order by name desc;
pw9qyyiw

pw9qyyiw1#

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

select  driver_num 
       ,name
       ,destination 
       ,arrived_date    
       ,arrive_time
from   (
        select routes.driver_num 
              ,routes.destination   
              ,routes.arrived_date  
              ,routes.arrive_time
              ,drivers.name
              ,row_number() over(partition by drivers.driver_num order by routes.arrived_date desc, routes.arrive_time desc) as rn
        from drivers join routes on routes.driver_num = drivers.driver_num
        where  drivers.home <> routes.destination
        ) t
where rn = 1

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

taor4pac

taor4pac2#

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

/*
WITH
  drivers (driver_num, name, home) AS
(
  VALUES
    (1, 'Bob', 'Columbus')
)
, routes (driver_num, destination, arrived_date, arrive_time) AS
(
  VALUES
    (1, 'Columbus', 1220825, 1200),
    (1, 'Indianapolis', 1220825, 1800),
    (1, 'Columbus', 1220826, 1000),
    (1, 'Indianapolis', 1220826, 1200)
)

* /

SELECT 
  r.driver_num 
, r.destination 
, r.arrived_date    
, r.arrive_time
, d.name
FROM drivers d
CROSS JOIN LATERAL 
(
  SELECT 
    r.driver_num 
  , r.destination   
  , r.arrived_date  
  , r.arrive_time
  FROM routes r
  WHERE r.driver_num = d.driver_num
  ORDER BY r.arrived_date DESC, r.arrive_time DESC
  FETCH FIRST 1 ROW ONLY
) r

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

相关问题