0

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?我可能会遇到任何明显的漏洞吗?

4

1 回答 1

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 给出的边界条件,即每个 start record 都会有一个匹配的 end-record。如果没有: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)
于 2013-01-20T11:58:41.320 回答