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