根据两列和日期系列查找缺失的行 - Postgresql

Find missing rows based on two columns and date series – Postgresql

我尝试搜索缺失的句点(年份和月份 = 201508)以及每个员工签名 'AA'。搜索一栏有效:

SELECT * 
FROM generate_series('2014-12-31','2016-12-31', interval '1 month') AS dates 
WHERE to_char(dates,'YYYYMM') NOT IN (SELECT ts_per FROM ts)

http://sqlfiddle.com/#!15/0cafa/4

这个输出只是缺少的月份

好像少了三月

但我也希望输出是每个员工。 JD 缺少 1 月和 3 月的记录,2 月和 3 月缺少 AS 的记录。 BB 三个月都不见了。

JD 201502
JD 201503 
AS 201501
AS 201503
BB 201501
BB 201502
BB 201503

这是我的新手尝试将员工添加到失败的搜索:

http://sqlfiddle.com/#!15/0cafa/5

错误:语法错误

任何线索的 TIA,

抱歉,不确定您想要什么...但会推荐您外部联接

SELECT * FROM generate_series('2015-01-01','2015-03-01', interval '1 month') AS dates
left outer join ts on concat(ts_sign,ts_per) = concat(ts_sign,to_char(dates,'YYYYMM'))

看到相同和丢失,并且:

SELECT * FROM generate_series('2015-01-01','2015-03-01', interval '1 month') AS dates
left outer join ts on concat(ts_sign,ts_per) = concat(ts_sign,to_char(dates,'YYYYMM'))
where ts_per is null

只看不见

我通过使用 WITH 创建临时列表解决了这个问题。使用此临时列表搜索 table 成功了

http://sqlfiddle.com/#!15/0cafa/12

WITH per AS 
(SELECT concat(emp_id,to_char(generate_series('2015-01-01','2015-03-01', interval '1 month'),'YYYYMM')) as signper FROM emp)
SELECT * FROM per where signper not in(SELECT concat(ts_sign,ts_per) FROM ts)