Sql:确定事件的活动时段,从开始日期和结束日期分为2个表

时间:2013-01-20 11:23:54

标签: sql

Sql问题:确定一个事件的有效期从开始日期和结束日期分为2个表

这是我需要制作的特别报告。我提供了2个与事件有关的提取文件(csv)。我打算将这些提取插入到单个sql表#temp_events。

文件1:

event, start date
Core training, 01Jan2011
Certification reviews, 23Feb2011
Core training, 15May2011
Abc Event, 24Nov2011

文件2:

event, end date
Core training, 05Jan2011
Certification reviews, 24Feb2011
Core training, 18May2011
Abc Event, 30Nov2011

我想插入#temp_events,其中一个条目将定义一个事件的活动期。请注意,没有FK,因为这是当前的主要问题...关联数据的唯一方法是通过事件名称,但可能会发生多次事件。无法计算事件的结束,因为没有数据定义事件的持续时间。不幸的是,这些是我必须处理的提取程序提供商已经规定的限制。

任何人都可以为我需要编码的逻辑提供建议,这样即使没有自然键/ id / FK,我也可以可靠地将文件1中的事件链接到文件2吗?我可能遇到任何明显的漏洞吗?

1 个答案:

答案 0 :(得分:2)

你去了:

CREATE TABLE eventstart
        ( event VARCHAR NOT NULL
        , zdate date
        );
INSERT INTO eventstart(event,zdate) VALUES
 ( 'Core training' , '2011-01-01' )
,( 'Certification reviews' , '2011-02-23' )
,( 'Core training' , '2011-05-15' )
,( 'Abc Event' , '2011-11-24' )
        ;


CREATE TABLE eventend
        ( event VARCHAR NOT NULL
        , zdate date
        );
INSERT INTO eventend(event,zdate) VALUES
 ('Core training' , '2011-01-05' )
,('Certification reviews' , '2011-02-24' )
,('Core training' , '2011-05-18' )
,('Abc Event' , '2011-11-30' )
        ;

WITH    s AS (
        SELECT ss.event, ss.zdate
        , ROW_NUMBER() OVER( PARTITION BY ss.event ORDER BY ss.zdate) AS zrnk
        FROM eventstart ss
        )
        ,e AS (
        SELECT ee.event, ee.zdate
        , ROW_NUMBER() OVER( PARTITION BY ee.event ORDER BY ee.zdate) AS zrnk
        FROM eventend ee
        )
SELECT s.event
       , s.zdate AS sdate
       , e.zdate AS edate
FROM s
LEFT JOIN e ON e.event = s.event AND s.zrnk = e.zrnk
WHERE s.zdate <= COALESCE(e.zdate , s.zdate) -- safety valve ;-)
        ;

注意:上面的查询非常粗鲁。它依赖于OP给出的边界条件,每个开始记录都会有匹配的结束记录。如果不是:YMMV

结果:

CREATE TABLE
INSERT 0 4
CREATE TABLE
INSERT 0 4
         event         |   sdate    |   edate    
-----------------------+------------+------------
 Abc Event             | 2011-11-24 | 2011-11-30
 Certification reviews | 2011-02-23 | 2011-02-24
 Core training         | 2011-01-01 | 2011-01-05
 Core training         | 2011-05-15 | 2011-05-18
(4 rows)