0

我有一个包含导入文件索引的表,其中包含每个导入文件的日期和分支。

现在我需要做多个分支的合并,所以,我必须在我们假期的时候复制一些分支的信息,以便数据保持一致,基本上我需要用最新的可用信息来填补这些空白。

我尝试使用排名进行一些自联接,以便在它们之间切换并获取以前的数据,但它没有用。

我有一张桌子:

rundate, branch, imported 
2015-04-01, PL1, TRUE 
2015-04-01, ES1, TRUE 
2015-04-01, CZ4, TRUE 
2015-04-02, PL1, TRUE 
2015-04-02, ES1, TRUE 
2015-04-02, CZ4, TRUE   
2015-04-03, ES1, TRUE 
2015-04-03, CZ4, TRUE

在这个例子中,我想做一个返回的查询:

gap_date, branch, real_date
2015-04-03, PL1, 2015-04-02

这张表很小(几千行),所以性能应该不是大问题。

关于如何实现这一目标的任何想法?

现在我正在使用一个函数,它接收间隔日期的运行日期和分支作为参数,并回答作为参数传递的日期之前的最新日期(使用 max(rundate) where rundate <= '$1')

谢谢!

4

3 回答 3

1

您可以使用outer join,subquerycross join:

架构:

create table tbl(rundate date, 
                 branch varchar(10), 
                 imported bool);
insert into tbl values('2015-04-01', 'PL1', TRUE),
('2015-04-01', 'ES1', TRUE), 
('2015-04-01', 'CZ4', TRUE), 
('2015-04-02', 'PL1', TRUE), 
('2015-04-02', 'ES1', TRUE), 
('2015-04-02', 'CZ4', TRUE),  
('2015-04-03', 'ES1', TRUE), 
('2015-04-03', 'CZ4', TRUE); 

询问:

select q.rundate as gap_date,q.branch,
       (select max(tt.rundate) 
        from tbl tt
        where tt.rundate<q.rundate and tt.branch=q.branch)
        as real_date
from tbl t
right outer join(
         select rundate,branch from (
                select distinct rundate from tbl) t1
                cross join (
                select distinct branch from tbl)t2
          )q 
on t.rundate=q.rundate and t.branch=q.branch
where t.branch is null

结果:

gap_date    branch  real_date
2015-04-03  PL1     2015-04-02
于 2015-04-14T15:22:43.817 回答
0

您必须选择一组中的所有唯一日期,另一组中的所有唯一分支-对其进行笛卡尔积-然后您可以检查哪个组合存在差距...这就是我的意思:

CREATE TEMPORARY TABLE _matrix
SELECT
t1.rundate,
t2.branch
(SELECT DISTINCT rundate FROM yourtable) t1,
(SELECT DISTINCT branch FROM yourtable) t2

然后,您可以使用 LEFT JOIN 和“WHERE ... IS NULL”语句找到间隙:

SELECT
m.rundate,
m.branch
FROM _matrix m
LEFT JOIN yourtable yt ON(yt.rundate = m.rundate AND yt.branch = m.branch)
WHERE yt.rundate IS NULL

当然,没有临时表也可以实现同样的效果——只使用一个子查询。尤其是当性能不重要时。

于 2015-04-14T14:49:17.110 回答
0

这是carthesian product of both domains来自@voycheck 的解决方案,但实际存在的记录除外。

WITH br AS (
        SELECT DISTINCT branch AS branch FROM tbl
        )
, mima AS (
        SELECT MIN(rundate) as mi
             , MAX(rundate) as ma
        FROM tbl)
, rng AS (
        SELECT generate_series( mima.mi, mima.ma, '1 day'::interval)::date AS rundate
        FROM mima
        )
SELECT * FROM rng
JOIN br ON NOT EXISTS ( -- cartesian product EXCEPT
        SELECT *
        FROM tbl t
        WHERE t.branch = br.branch
        AND t.rundate = rng.rundate
        )
        ;
于 2015-04-14T16:24:50.750 回答