根据两列和日期系列查找缺失的行 - 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)
我尝试搜索缺失的句点(年份和月份 = 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)