基于worker_log日期判断request工单工人可用状态(PostgreSQL)
用LATERAL连接实现工单工人可用状态判断
假设你的表结构大致如下:
worker_log:store_id(门店ID)、log_date(日期)、worker_count(当日工人数量)request_log:request_id(工单编号)、request_date(请求日期)、store_id(门店ID)
要生成包含工单信息和工人可用状态的requests表,可以用LATERAL关联子查询实现,它会为request_log的每一行匹配对应门店、对应日期的worker_log记录,进而判断工人是否可用:
CREATE TABLE requests AS SELECT r.request_id, r.request_date, r.store_id, CASE WHEN w.worker_count > 0 THEN '可用' ELSE '不可用' END AS worker_availability FROM request_log r LEFT JOIN LATERAL ( SELECT worker_count FROM worker_log w WHERE w.store_id = r.store_id AND w.log_date = r.request_date ) w ON true;
逻辑说明
LEFT JOIN LATERAL (...) w ON true:LATERAL子查询会逐个遍历request_log的每一行,根据当前工单的store_id和request_date,精准匹配worker_log中的对应记录。用LEFT JOIN是为了保留所有工单请求——哪怕某个工单对应的日期/门店没有工人日志记录,此时worker_count会是NULL,CASE判断会返回"不可用"。- CASE语句:直接根据匹配到的工人数量判断状态,大于0则标记为可用,其余情况(包括无匹配记录)均标记为不可用。
如果只需要保留有工人日志记录的工单,可以把LEFT JOIN换成INNER JOIN,过滤掉无对应工人数据的请求,按需调整即可。
内容的提问来源于stack exchange,提问作者user1893649
相关产品推荐
相关产品推荐

