ďťż
 
SQL i genealogia ďťż
 
SQL i genealogia
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • melooonka.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com