我有三个PostgreSQL表:地址,发货和时间表。 货件和时间表都有地址的外键。
地址表包含有关地址的信息:id,name,number,street,state,zip 货件表有:id,跟踪号,date_ship_on,address_id 时间表有:id,sunday,monday,tuesday,Wednesday,thrusday,friday,Saturday,type,address_id
日程表中的所有日期都是布尔值ex:id = 2,sunday = false,monday = true,tuesday = true,wednesday = true,thrusday = false,friday = false,saturday = false,type ='报告',address_id = 1
我正在尝试做的是,将三个表连接在一起,找到昨天没有发货的地址,它应该基于类型“报告”的时间表。因此,例如,我们有3个地址,芝加哥,洛杉矶,纽约,今天是星期二,芝加哥昨天发出两个货物(发货日期存储在date_shipped_on,所以它将有昨天的日期,我们可以找到昨天是从哪一天但是洛杉矶和纽约市并没有发出任何消息,芝加哥和洛杉矶在周一的报告时间表都是如此,但纽约市没有。我应该得到的是洛杉矶的结果,因为它没有星期一发出的货物,但应该根据时间表。我将在前一天每天运行此报告。
我尝试了一些不同的东西,但没有运气。任何帮助将不胜感激。
答案 0 :(得分:1)
SELECT a.*
FROM address a INNER JOIN schedule s ON a.id = s.address_id
-- no shipment sent out yesterday
WHERE NOT EXISTS (SELECT * FROM shipment sh
WHERE sh.address_id = a.id
AND date_ship_on >= TIMESTAMP 'yesterday'
AND date_ship_on < TIMESTAMP 'today')
-- was supposed to based on the schedule with the type 'reporting'
AND s.type = 'reporting'
AND (
(s.sunday = true AND extract(dow from current_timestamp) = 1)
OR (s.monday = true AND extract(dow from current_timestamp) = 2)
OR (s.tuesday = true AND extract(dow from current_timestamp) = 3)
OR (s.wednesday = true AND extract(dow from current_timestamp) = 4)
OR (s.thursday = true AND extract(dow from current_timestamp) = 5)
OR (s.friday = true AND extract(dow from current_timestamp) = 6)
OR (s.saturday = true AND extract(dow from current_timestamp) = 0)
);
一些解释:
如果要简化此查询,可以考虑调度表的另一种结构。例如:id,day_of_week(int),type,address_id。
编辑:根据Clockwork-Muse的评论在时间戳上添加了包含下限。