SQL i genealogia
Bastion - 17-04-2006 00:02
SQL i genealogia
Witam
Amatorsko zajmuje sie badaniem genealogii mojej rodziny. Dane genealogiczne zapisuje w takiej tabeli:
CREATE TABLE "DBA"."osoba" ( "id" varchar(15) NOT NULL UNIQUE, "Imie" varchar(30) NOT NULL, "Nazwisko" varchar(30) NOT NULL, "MUrodzenia" varchar(40) NOT NULL, "DUrodzenia" date NULL, "MSmierci" varchar(40) NOT NULL, "DSmierci" date NULL, "ID_Rodzica" varchar(15) NOT NULL, PRIMARY KEY ( "id" ) );
Przyjalem takie zalozenie, ze jezeli nie jest znana data urodzenia, smierci danej osoby to przypisuje date '1000-01-01'
Moja baza liczy obecnie ok 2000 nazwisk na przestrzeni 300 lat, SQL daje wiele fajnych mozliwosci analizowania takich danych:
// wyszukiwnie wyzow demograficznych select nazwisko,year(Durodzenia),count(*) from osoba where year(dUrodzenia)<>'1000' group by nazwisko,year(DUrodzenia) order by count(*) desc
// dzien "najwiekszej smiertelnosci" select DSmierci ,nazwisko,count(*) from osoba where year(DSmierci)<>1000 group by DSmierci,nazwisko order by Count(*) desc ,dsmierci
// najwieksza ilosc dzieci w rodzine select (select imie from osoba where id=a),id_rodzica as a,nazwisko,count(id_rodzica) from osoba group by nazwisko,id_rodzica order by Count(id_rodzica) desc
// miejscowosc z ktorej pochodzi najwiecej osob o danym nazwisku select MUrodzenia,nazwisko,count(*) from osoba group by MUrodzenia,nazwisko order by Count(*) desc
//j.w. miejsce smierci select MSmierci ,nazwisko,count(*) from osoba where MSmierci<>'' group by MSmierci,nazwisko order by Count(*) desc
// ilosc osob o danym nazwisku select count(id),nazwisko from osoba group by nazwisko order by count(id) desc
// ilosc osob o tym samym nazwisku i imieniu select imie,nazwisko,count(id) from osoba group by imie,nazwisko order by count(id) desc
//wyszukiwanie blizniakow select durodzenia,id_rodzica,count(*) from osoba where year(durodzenia)<>1000 group by durodzenia,id_rodzica order by count(*) desc
Czy ktos z grupowiczow zajmuje sie podoba problematyka? Moze, ktos ma pomysl na inne ciekawe zapytanie SQL?
Pozdrawiam
Sirtap - 18-04-2006 00:37
Użytkownik "Bastion" <paradygmat@bez_maila.pl> napisał w wiadomości news:e1u82g$28q$1@nemesis.news.tpi.pl... > Witam > > Amatorsko zajmuje sie badaniem genealogii mojej rodziny. > Dane genealogiczne zapisuje w takiej tabeli:
Hej A nie lepiej byłoby ustawiać date na NULL, gdy nie jest ona znana (zamiast '1000-01-01')? To chyba jest logiczne ;) Wtedy możesz badać czy podano date poprzez IS NOT NULL.
Pozdrawiam Andrew
Bastion - 18-04-2006 00:37
Uzytkownik "Sirtap" <sirtap@gazeta.pl> napisal w wiadomosci news:e1vjf6$dim$1@inews.gazeta.pl... > Użytkownik "Bastion" <paradygmat@bez_maila.pl> napisał w wiadomości > news:e1u82g$28q$1@nemesis.news.tpi.pl... > > Witam > > > > Amatorsko zajmuje sie badaniem genealogii mojej rodziny. > > Dane genealogiczne zapisuje w takiej tabeli: > > > Hej > A nie lepiej byłoby ustawiać date na NULL, gdy nie jest ona znana > (zamiast '1000-01-01')? To chyba jest logiczne ;) Wtedy możesz badać czy > podano date poprzez IS NOT NULL. >
Witam
Ta data '1000-01-01' wynikala z algorytmu ktorym przepisalem dane z XML-a do tabeli Sybase. W XML mialem format daty dd-MM-yyyy dodatkowo mialem np. takie wpisy "ok. 1790" (okolo), "11-1920" (nie znany dzien), "01-04-1950?" (prawdopodobna data). trzeba bylo to wszystko przekonwertowac do formatu "yyyy-MM-dd", zrobilem to taka funkcja:
//Borland C++ Builder AnsiString __fastcall Daj_Date(AnsiString aData) { Word d=1,m=1,y=1000; AnsiString a; aData=StringReplace(aData,"-","",TReplaceFlags()<<rfReplaceAll); aData=StringReplace(aData," ","",TReplaceFlags()<<rfReplaceAll); aData=StringReplace(aData,"ok","",TReplaceFlags()< <rfReplaceAll); aData=StringReplace(aData,".","",TReplaceFlags()<< rfReplaceAll); aData=StringReplace(aData,"?","",TReplaceFlags()<< rfReplaceAll); if (aData.Length()>=4) { a=aData.SubString(aData.Length()-3,4); y=StrToInt(a); if(aData.Length()>=6) { a=aData.SubString(aData.Length()-5,2); m=StrToInt(a); if(aData.Length()==8) { a=aData.SubString(aData.Length()-7,2); d=StrToInt(a); } } } TDateTime dt=EncodeDate(y,m,d); return(DateToStr(dt)); }
Czyli w przypadku braku dnia otrzymuje: "yyyy-MM-01", w przypadku braku dnia i miesiaca: "yyyy-01-01" natomiast przy braku daty otrzymuje: '1000-01-01'.
W chyba masz racje. Lepiej date '1000-01-01' zastapic NULL-em:
update osoba set DSmierci=NULL where year(DSmierci)=1000;
update osoba set DUrodzenia=NULL where year(DUrodzenia)=1000;
Pozdrawiam
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
Jak =?windows-1250?Q?pobra=E6_szacowan=B9_wielko=9C=E6_zbiory_wy nikowego_w_MS?==?windows-1250?Q?_SQL_2005=3F?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
=?ISO-8859-2?Q?k=B3opot_z_uruchomieniem_MY_SQL_dla_C?==?ISO-8859-2?Q?MS_i_CRM_na_Fedora_Core_3?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plmelooonka.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|