Create event table from family reconstitution db

Fra Harald Grovens wiki

Gå til: navigasjon, søk

Notes from George Alters lectures at ICPSR summer course in historical demography


[rediger] 01 Make table with births

This query creates a table events1 to store all birth events from the children table. Alongside the birth date and family ID number, three constants are also created:

  • ced children ever born, is set to 1 in order to count number of children in other queries.
  • ceb children ever died is set to zero, since this is a birth event.
  • event, the text "Birth" is added to all records

lb_birth alias for birth date. (What purpose???)

lb_death column with alias for death date of the child (purpose??)

Only single children (multbo is NULL) or one child from a twin birth (multbo is 1) is SELECT ed, since birth of twins should count as one event in the event1 table but are represented as 2 records in the children table.


SELECT  children.famid,
	children.bdate AS evdate,
	"Birth" AS event,
	children.bdate AS lb_birth,
	children.ddate AS lb_death,
	1 AS ceb,
	0 AS ced INTO events1
FROM children
WHERE (((children.multbo) IS NULL OR (children.multbo)=1))
;

[rediger] Bint 02 set ceb=2 for twins

For those events which both have same familyID and birthday, i.e. are twins, should have its children-ever-born (ceb) count set to 2 instead of 1.

UPDATE children 
INNER JOIN events1 ON (children.famid = events1.famid) 
AND (children.bdate = events1.evdate) SET events1.ceb = 2
WHERE (((children.multbo)=2))
;

[rediger] Bint 03 update eventsWHERE the second twin dies later

The eventsWHERE we know (ddate is not null) that the second twin (multbo = 2) dies before the first one, the deathdate in the event record is updated to the death day of the second.

Why? Becuase of breast feeding?

UPDATE events1 
INNER JOIN children ON (events1.famid = children.famid) 
AND (events1.evdate = children.bdate) 
SET events1.lb_death = children.ddate
WHERE (((events1.lb_death)<[children].[ddate]) 
AND ((children.multbo)= 2))   
AND ((children.ddate) IS NULL)
;

[rediger] Bint04 child deaths

For those children records we know the death date (ddate is not NULL) we insert the data from the list of Children table into the events1 table. The Children ever died (ced) to 1 and Children ever born (ceb) to zero.

INSERT INTO events1 
(famid,
	event,
	evdate,
	ced,
	ceb )
<source lang="sql">
SELECT  children.famid,
	"Child_death" AS event,
	children.ddate AS evdate,
	1 AS ced,
	0 AS ceb
FROM children
WHERE (((children.ddate) IS NOT NULL))
;

[rediger] Bint05 infant deaths +9

If there is less than one year between birthdate bdate and death date ddate in the childrens table, an "infant death" event is created. It is not stored as a Child Ever Died ced since this an event is already created for the death.

INSERT INTO events1 
(famid,
	event,
	evdate,
	ced,
	ceb)
<source lang="sql">
SELECT  children.famid,
	"Infant_death" AS event,
	DateAdd("d",274,[children].[ddate]) AS evdate,
	0 AS ced,
	0 AS ceb
FROM children
WHERE (((DateAdd("d",274,[children].[ddate])) IS NOT NULL) 
AND ((DateDiff("y",[children].[bdate],[children].[ddate])/365.25)<1))
;

[rediger] Bint06 marriages

SELECT  ALL marriages WITH marriage date TO the ''event1'' TABLE. 
 
INSERT INTO events1 ( famid,
	evdate,
	event,
	ceb,
	ced )
;
 
SELECT  marriages.famid,
	marriages.mdate AS evdate,
	"Marriage" AS event,
	0 AS ceb,
	0 AS ced
FROM marriages
;

[rediger] Bint07 end of union mother 50

Find the wife's 50th birthday and add it to the event1 table. The DateAdd function with years (yyyy) as time denomination will do this. Since 50 is the definitive end of her reproducive life, this will demographically be equivalent to a divorce... don't tell the pope:-)

INSERT INTO events1 ( famid,
	event,
	evdate,
	ceb,
	ced )
;	
 
SELECT  marriages.famid,
	"End_union" AS event,
	DateAdd("yyyy",50,marriages.wbdate) AS evdate,
	0 AS ceb,
	0 AS ced
FROM marriages
;

[rediger] Bint08 husband dies first

Find "End of union" eventsWHERE the husbands death date, hddate, is before the date of the end of union date. This will remove duplicate end of union events.

UPDATE marriages 
INNER JOIN events1 ON marriages.famid = events1.famid 
SET events1.evdate = marriages.hddate
WHERE (((events1.event)="End_union") 
AND ((marriages.hddate)<[events1].[evdate]))
;

[rediger] Bint09 wife dies first

For those marriage recordsWHERE the End of union date in the corresponding events1 table is before the wife's death date (wddate), the date should be updated to the the wife's death date.

UPDATE marriages 
INNER JOIN events1 ON marriages.famid = events1.famid 
SET events1.evdate = marriages.wddate
WHERE (((events1.event)="End_union") 
AND ((marriages.wddate) < [events1].[evdate]))
;

Create an empty table named events2 by copying the events1 table.

[rediger] Bint10 empty events2 table

Add the columns offset and priority

Why do this step??

DELETE events2.*
FROM events2
;

[rediger] Bint11 append to event2

The table event_types must be created manually with 4 fields

  • event text
  • priority number
  • offset number
  • seq autonumber. This will get a value assigned automatically when data is enterd. Since the data in the following query is sorted first by familyID and then by date, the seq will be sequental and ordinal that may be used for recursive self-joins.

This query is large as a nightmare!

It pulls most of the data from events1, sorts it according to priority and then pushes it into events2. This is necessary because the event records created in the 10 previous queries are not in the right sort order.

Why does it do a self join two times (events1_1, events1_2) ? Since there are several event records for each family, one alias is created in order to filter. Because of the self-join, several duplicates are created, but ...

INSERT INTO events2 ( famid,
	evdate,
	priority,
	offset,
	event,
	lb_birth,
	lb_death,
	ceb,
	ced )
;
 
SELECT  events1.famid,
	events1.evdate,
	event_types.priority,
	event_types.offset,
	events1.event,
	events1.lb_birth,
	events1.lb_death,
	events1.ceb,
	events1.ced
FROM ((events1 
INNER JOIN events1 AS events1_1 ON events1.famid = events1_1.famid) 
INNER JOIN events1 AS events1_2 ON events1.famid = events1_2.famid) 
INNER JOIN event_types ON events1.event = event_types.event
WHERE (((events1_1.event)="Marriage") 
AND ((events1_1.evdate)<=[events1].[evdate]) 
AND ((events1_2.event)="End_union") 
AND ((events1_2.evdate)>=[events1].[evdate]))
ORDER BY events1.famid,
	events1.evdate,
	event_types.priority
;

[rediger] Bint12 fix offset for twins dying on same day

Cox regressions don't work when there are "ties", that means multiple events on the exately same time. In order to fix this, an artificial small amont of time are added to one of two concurrent events. An example of a such event is the rare caseWHERE two twins die the very same day. Here 0.05 days is added to each such event.

UPDATE events2 
INNER JOIN events2 AS events2_1 ON (events2.evdate = events2_1.evdate) 
AND (events2.event = events2_1.event) 
AND (events2.famid = events2_1.famid) 
SET events2_1.offset = events2_1.offset+0.05
WHERE (((events2.event)="Child_death") 
AND ((events2_1.seq)=[events2].[seq]+1))
;

[rediger] Bint13 accumulate ceb

UPDATE events2 
INNER JOIN events2 AS events2_1 ON events2.famid = events2_1.famid SET events2_1.ceb = events2_1.ceb+events2.ceb
WHERE (((events2_1.seq)=[events2].[seq]+1))
;

[rediger] Bint14 accumulate ced

UPDATE events2 
INNER JOIN events2 AS events2_1 ON events2.famid = events2_1.famid SET events2_1.ced = [events2_1].[ced]+[events2].[ced]
WHERE (((events2_1.seq)=[events2].[seq]+1))
;

[rediger] Bint15 copy forward lb birth

UPDATE events2 
INNER JOIN events2 AS events2_1 ON events2.famid = events2_1.famid SET events2_1.lb_birth = [events2].[lb_birth]
WHERE (((events2_1.lb_birth) IS NULL) 
AND ((events2_1.seq)=[events2].[seq]+1))
;

[rediger] Bint16 copy forward lb death

UPDATE events2 
INNER JOIN events2 AS events2_1 ON events2.famid = events2_1.famid SET events2_1.lb_death = [events2].[lb_death]
WHERE (((events2_1.lb_death) IS NULL) 
AND ((events2_1.seq)=[events2].[seq]+1))
;

[rediger] Bint17 age first birth

SELECT  events2.famid,
	events2.evdate,
	events2.ceb,
	marriages.wbdate,
	DateDiff("y",marriages.wbdate,events2.evdate)/365.25 AS agefb INTO agefirstbirth
FROM events2 
INNER JOIN marriages ON events2.famid = marriages.famid
WHERE (((events2.ceb)=1) 
AND ((events2.event)="Birth"))
;

[rediger] Bint18 episodes

SELECT  events2.famid,
	events2.evdate AS evdate1,
	events2.event AS event1,
	events2.lb_birth,
	events2.lb_death,
	events2.ceb,
	events2.ced,
	events2.offset AS offset1,
	events2_1.evdate AS evdate2,
	events2_1.event AS event2,
	events2_1.offset AS offset2,
	agefirstbirth.wbdate,
	agefirstbirth.agefb
FROM (events2 
INNER JOIN events2 AS events2_1 ON events2.famid = events2_1.famid) 
LEFT JOIN agefirstbirth ON events2.famid = agefirstbirth.famid
WHERE (((events2_1.seq)=[events2].[seq]+1))
;

[rediger] Same queries for Henry data

[rediger] 1

SELECT  [children].PARID,
	[children].KIDID,
	[children].VILLAGE,
	[children].N0_FICH,
	[children].TYP_FICH,
	[children].kid_DOB AS evdate,
	"birth" AS event,
	[children].kid_DOB AS lb_birth,
	[children].kid_DDie AS lb_death,
	1 AS ceb,
	0 AS ced,
	[children].TWIN,
	[children].TRIPLET INTO events
FROM [children]
WHERE ((([children].TWIN)>=0))
;

[rediger] 2 Twins

 
UPDATE events 
INNER JOIN [children] ON (events.PARID = [children].PARID) 
AND (events.evdate = [children].kid_DOB) 
SET events.ceb = 2
WHERE ((([children].TWIN)=1) 
AND (([children].TRIPLET) IS NULL))
;

[rediger] 3 Triplets

 
UPDATE events 
INNER JOIN [children] ON (events.evdate = [children].kid_DOB) 
AND (events.PARID = [children].PARID) 
SET events.ceb = 3
WHERE ((([children].TWIN)=1) 
AND (([children].TRIPLET)=1))
;

[rediger] 4 Death of twins

 
UPDATE events 
INNER JOIN [children] ON (events.PARID = [children].PARID) 
AND (events.evdate = [children].kid_DOB) 
SET events.lb_death = [children].kid_DDie
WHERE (((events.lb_death)<[children].[kid_DDie]))
;

[rediger] 5 death of triplets

 
UPDATE events 
INNER JOIN [children] ON (events.PARID = [children].PARID) 
AND (events.evdate = [children].kid_DOB) 
SET events.lb_death = [children].kid_DDie
WHERE (((events.lb_death)<[children].[kid_DDie]))
;

[rediger] 6 death

 
INSERT INTO events 
(PARID,
	KIDID,
	VILLAGE,
	event,
	evdate,
	ced,
	ceb )
<source lang="sql">
SELECT  [children].PARID,
	[children].KIDID,
	[children].VILLAGE,
	"child_death" AS event,
	[children].kid_DDie AS evdate,
	1 AS ced,
	0 AS ceb
FROM [children]
WHERE ((([children].kid_DDie) IS NOT NULL))
;

[rediger] 7 infant deaths

 
INSERT INTO events 
(PARID,
	KIDID,
	VILLAGE,
	event,
	evdate,
	ced,
	ceb )
 
 
;
 
 
SELECT  [children].PARID,
	[children].KIDID,
	[children].VILLAGE,
	"infant_death" AS event,
	DateAdd("d", 274, [children].kid_DDie) AS evdate,
	0 AS ced,
	0 AS ceb
FROM [children]
WHERE (((DateAdd("d", 274, [children].[kid_DDie])) IS NOT NULL) 
AND ((DateDiff("y", [children].[kid_DOB],
	[children].[kid_DDie])/365.25)<1))
;

[rediger] 8 marriages

 
INSERT INTO events 
(PARID,
	event,
	ceb,
	ced,
	evdate,
	VILLAGE )
<source lang="sql">
SELECT  parent_newdates.PARID,
	"marriage" AS event,
	0 AS ceb,
	0 AS ced,
	parent_newdates.marriage AS evdate,
	parent_newdates.VillageID AS VILLAGE
FROM parent_newdates
;

[rediger] 9 End of union when woman is 50

INSERT INTO events 
(PARID,
	event,
	evdate,
	ceb,
	ced,
	VILLAGE )
<source lang="sql">
SELECT  parent_newdates.PARID,
	"end_union" AS event,
	DateAdd("yyyy", 50, parent_newdates.DOB_W) AS evdate,
	0 AS ceb,
	0 AS ced,
	parent_newdates.VillageID AS VILLAGE
FROM parent_newdates
;

[rediger] 10 Death of husband

 
UPDATE events 
INNER JOIN parent_newdates ON events.PARID = parent_newdates.PARID 
SET events.evdate = parent_newdates.dead_H
WHERE (((events.event)="end_union") 
AND ((parent_newdates.dead_H)<[events].[evdate])) 
OR (((events.evdate) IS NULL) 
AND ((events.event)="end_union"))
;

[rediger] 11 death of wife

UPDATE events 
INNER JOIN parent_newdates ON events.PARID = parent_newdates.PARID 
SET events.evdate = parent_newdates.dead_W
WHERE (((events.event)="end_union") 
AND ((parent_newdates.dead_W)<[events].[evdate])) 
OR (((events.evdate) IS NULL) 
AND ((events.event)="end_union"))
;

[rediger] 12

INSERT INTO events2 
(PARID,
	VILLAGE,
	evdate,
	event,
	lb_birth,
	lb_death,
	ceb,
	ced,
	priority,
	offset )
;
SELECT  events.PARID,
	events.VILLAGE,
	events.evdate,
	events.event,
	events.lb_birth,
	events.lb_death,
	events.ceb,
	events.ced,
	event_types.priority,
	event_types.offset
FROM ((events 
INNER JOIN events AS events_1 ON events.PARID = events_1.PARID) 
INNER JOIN events AS events_2 ON events_1.PARID = events_2.PARID) 
INNER JOIN event_types ON events.event = event_types.event
WHERE (((events_1.event)="marriage") 
AND ((events_1.evdate)<=[events].[evdate]) 
AND ((events_2.event)="end_union") 
AND ((events_2.evdate)>=[events].[evdate]))
ORDER BY events.PARID,
	events.VILLAGE,
	events.evdate,
	event_types.priority
;

[rediger] 13

UPDATE events2 
INNER JOIN events2 AS events2_1 ON (events2.PARID = events2_1.PARID) 
AND (events2.evdate = events2_1.evdate) 
AND (events2.event = events2_1.event) 
AND (events2.offset = events2_1.offset) 
SET events2_1.offset = events2_1.offset+0.03
WHERE (((events2.event)="child_death") 
AND ((events2_1.seq)=[events2].[seq]+1))
;

[rediger] 14

UPDATE events2 
INNER JOIN events2 AS events2_1 ON (events2.event = events2_1.event) 
AND (events2.evdate = events2_1.evdate) 
AND (events2.PARID = events2_1.PARID) 
AND (events2.offset = events2_1.offset) 
SET events2_1.offset = events2_1.offset+0.03
WHERE (((events2.event)="child_death") 
AND ((events2_1.seq)=[events2].[seq]+1))
;

[rediger] 15

UPDATE events2 
INNER JOIN events2 AS events2_1 ON events2.PARID = events2_1.PARID 
SET events2_1.ceb = events2_1.ceb+events2.ceb
WHERE (((events2_1.seq)=[events2].[seq]+1))
;

[rediger] 16

UPDATE events2 
INNER JOIN events2 AS events2_1 ON events2.PARID = events2_1.PARID 
SET events2_1.ced = events2_1.ced+events2.ced
WHERE (((events2_1.seq)=[events2].[seq]+1))
;

[rediger] 17

UPDATE events2 
INNER JOIN events2 AS events2_1 ON events2.PARID = events2_1.PARID 
SET events2_1.lb_birth = events2.lb_birth
WHERE (((events2_1.lb_birth) IS NULL) 
AND ((events2_1.seq)=[events2].[seq]+1))
;

[rediger] 18

UPDATE events2 
INNER JOIN events2 AS events2_1 ON events2.PARID = events2_1.PARID 
SET events2_1.lb_death = events2.lb_death
WHERE (((events2_1.lb_death) IS NULL) 
AND ((events2_1.seq)=[events2].[seq]+1))
;

[rediger] 19

SELECT  
	events2.PARID,
	events2.evdate AS evdate1,
	events2.event AS event1,
	events2.lb_birth,
	events2.lb_death,
	events2.ceb,
	events2.ced,
	events2.offset AS offset1,
	events2_1.evdate AS evdate2,
	events2_1.event AS event2,
	events2_1.offset AS offset2,
	villages.Region,
	villages.DistanceParis,
	events2_1.seq,
	events2.VILLAGE INTO [events2distance]
FROM (events2 
INNER JOIN events2 AS events2_1 ON (events2.PARID = events2_1.PARID) 
AND (events2.VILLAGE = events2_1.VILLAGE)) 
INNER JOIN villages ON events2_1.VILLAGE = villages.Village_ID
WHERE (((events2_1.seq)=[events2].[seq]+1))
;

[rediger] 20

SELECT  
	[events2distance].PARID,
	[events2distance].evdate1,
	[events2distance].event1,
	[events2distance].lb_birth,
	[events2distance].lb_death,
	[events2distance].ceb,
	[events2distance].ced,
	[events2distance].offset1,
	[events2distance].evdate2,
	[events2distance].event2,
	[events2distance].offset2,
	[events2distance].Region,
	[events2distance].DistanceParis,
	[events2distance].seq,
	[events2distance].VILLAGE,
	[occupation codes].Code INTO [events2u2HouseOccup]
FROM [events2distance] 
INNER JOIN [occupation codes] ON [events2distance].PARID = [occupation codes].PARID
;

[rediger] 21

SELECT  
	[events2u2HouseOccup].PARID,
	[events2u2HouseOccup].evdate1,
	[events2u2HouseOccup].event1,
	[events2u2HouseOccup].lb_birth,
	[events2u2HouseOccup].lb_death,
	[events2u2HouseOccup].ceb,
	[events2u2HouseOccup].ced,
	[events2u2HouseOccup].offset1,
	[events2u2HouseOccup].evdate2,
	[events2u2HouseOccup].event2,
	[events2u2HouseOccup].offset2,
	[events2u2HouseOccup].Region,
	[events2u2HouseOccup].DistanceParis,
	[events2u2HouseOccup].seq,
	[events2u2HouseOccup].VILLAGE,
	[events2u2HouseOccup].Code,
	parents.AgeMarriageWoman INTO [events2u3wifeAgeAtMarr]
FROM [events2u2HouseOccup] 
INNER JOIN parents ON [events2u2HouseOccup].PARID = parents.PARID
;

[rediger] 22

SELECT  
	[events2u3wifeAgeAtMarr].PARID,
	[events2u3wifeAgeAtMarr].evdate1,
	[events2u3wifeAgeAtMarr].event1,
	[events2u3wifeAgeAtMarr].lb_birth,
	[events2u3wifeAgeAtMarr].lb_death,
	[events2u3wifeAgeAtMarr].ceb,
	[events2u3wifeAgeAtMarr].ced,
	[events2u3wifeAgeAtMarr].offset1,
	[events2u3wifeAgeAtMarr].evdate2,
	[events2u3wifeAgeAtMarr].event2,
	[events2u3wifeAgeAtMarr].offset2,
	[events2u3wifeAgeAtMarr].Region,
	[events2u3wifeAgeAtMarr].DistanceParis,
	[events2u3wifeAgeAtMarr].seq,
	[events2u3wifeAgeAtMarr].VILLAGE,
	[events2u3wifeAgeAtMarr].OccupCode,
	[events2u3wifeAgeAtMarr].AgeMarriageWoman,
	parents.TYP_FICH INTO [events2 UPDATE 3 (TYP_FICH)]
FROM [events2u3wifeAgeAtMarr] 
INNER JOIN parents ON [events2u3wifeAgeAtMarr].PARID = parents.PARID
WHERE (((parents.TYP_FICH)<15))
;