Klärt auf, wäscht up.
 
StartseiteStartseite  KalenderKalender  FAQFAQ  SuchenSuchen  MitgliederMitglieder  NutzergruppenNutzergruppen  AnmeldenAnmelden  LoginLogin  

Teilen | 
 

 Noch eine SQL Knobelei

Vorheriges Thema anzeigen Nächstes Thema anzeigen Nach unten 
AutorNachricht
Lord Helmchen
Captain
avatar


Anzahl der Beiträge : 651
Anmeldedatum : 20.05.12

BeitragThema: Noch eine SQL Knobelei   So Apr 26, 2015 10:14 am

Hi,
ich versuche gerade die letzte SQL Aufgabe zu lösen die mir gestellt wurde
Es ging darum, den h-index zu berechnen.
Das ist für den Professor die Zahl, wo die Summe (der Paper mit impact > x) grösser gleich ist als x.
Ich erkläre es unten nochmal.
Ich hab leider den Screenshot nicht gespeichert aber es sähe ungefähr so aus:

CREATE TABLE papers (
paper_id integer not null,
prof_id varchar(30) not null,
impact integer not null,
unique(paper_id)
);

INSERT INTO papers VALUES
(1,"Joka",3),
(2,"Joka",5),
(3,"Joka",10),
(4,"Joka",3),
(5,"Joka",5),
(6,"Joka",10),
(7,"Joka",3),
(8,"Joka",5),
(9,"Joka",10),
(11,"Waschi",5),
(12,"Waschi",5),
(13,"Waschi",6),
(14,"Waschi",5),
(15,"Waschi",5),
(16,"Waschi",6);

Was ich als Mensch-Maschine jetzt machen würde ist, zwei unter tabellen zu starten
Tabelle Joka
impact, sum_impact
3, 9
5, 6
10, 3

Tabelle Waschi
impact, sum_impact
5, 6
6, 2

Der h-index wäre dann die größte Zahl für die impact < sum_impact
Also
Tabelle Output
prof_id, h-index
Joka, 5
Waschi, 5


Ich habe nicht den hauch einer Ahnung, wie ich hier anfangen würde. Mir fehlen meine For loops


Dropping the bass since 2012
Nach oben Nach unten
Benutzerprofil anzeigen
Lord Helmchen
Captain
avatar


Anzahl der Beiträge : 651
Anmeldedatum : 20.05.12

BeitragThema: Re: Noch eine SQL Knobelei   So Apr 26, 2015 11:58 am

Hmm, naiver Versuch hat nicht geklappt (grösser gleich ist irgendwie nur grösser

SELECT prof_id, impact, count(impact>=impact) as papers_bigger
from papers
group by prof_id, impact;
prof_id impact papers_bigger
---------- ---------- -------------
Joka 3 3
Joka 5 3
Joka 10 3
Waschi 5 4
Waschi 6 2


Dropping the bass since 2012
Nach oben Nach unten
Benutzerprofil anzeigen
Lord Helmchen
Captain
avatar


Anzahl der Beiträge : 651
Anmeldedatum : 20.05.12

BeitragThema: Re: Noch eine SQL Knobelei   So Apr 26, 2015 12:40 pm

Ha! Geht natürlich nicht, weil impact ja immer gleich impact ist...

SELECT a.prof_id, a.impact, (select count(p.impact) from papers as p where a.prof_id=p.prof_id and p.impact>=a.impact) as papers_bigger
from papers as a
group by a.prof_id, a.impact;

prof_id impact papers_bigger
---------- ---------- -------------
Joka 3 9
Joka 5 6
Joka 10 3
Waschi 5 6
Waschi 6 2


Dropping the bass since 2012
Nach oben Nach unten
Benutzerprofil anzeigen
Lord Helmchen
Captain
avatar


Anzahl der Beiträge : 651
Anmeldedatum : 20.05.12

BeitragThema: Re: Noch eine SQL Knobelei   So Apr 26, 2015 9:06 pm

Also, hier ist eine komplett funktionierende Lösung, die auch alle sonderfälle behandelt (Sonderfall: jemand hat ein paper mit vielen Zitierungen geschrieben oder viele paper mit einer Zitierung)


CREATE TABLE papers (
paper_id integer not null,
prof_id varchar(30) not null,
impact integer not null,
unique(paper_id)
);

INSERT INTO papers VALUES
(1,"Joka",3),
(2,"Joka",5),
(3,"Joka",10),
(4,"Joka",3),
(5,"Joka",5),
(6,"Joka",10),
(7,"Joka",3),
(8,"Joka",5),
(9,"Joka",10),
(11,"Waschi",5),
(12,"Waschi",5),
(13,"Waschi",6),
(14,"Waschi",5),
(15,"Waschi",5),
(16,"Waschi",6),
(17,"Hannes",3),
(18,"Poeff",1),
(19,"Poeff",1);

Im Grunde ne union von zwei selects, die jeweils einen der Sonderfälle behandeln.

select g.prof_id, max(g.max_c) as haessliche_scheisse
from
(select d.prof_id, max_c
from
(select b.prof_id, min(b.papers_bigger) as max_c
from(
SELECT a.prof_id, a.impact, (select count(p.impact) from papers as p where a.prof_id=p.prof_id and p.impact>=a.impact) as papers_bigger
from papers as a
group by a.prof_id, a.impact) as b
where b.impact>b.papers_bigger
group by b.prof_id)as d
union
select c.prof_id, max_b
from
(select b.prof_id, max(b.impact) as max_b
from(
SELECT a.prof_id, a.impact, (select count(p.impact) from papers as p where a.prof_id=p.prof_id and p.impact>=a.impact) as papers_bigger
from papers as a
group by a.prof_id, a.impact) as b
where b.impact<=b.papers_bigger
group by b.prof_id)as c) as g
group by g.prof_id;
prof_id haessliche_scheisse
---------- -------------------
Hannes 1
Joka 5
Poeff 1
Waschi 5


Dropping the bass since 2012
Nach oben Nach unten
Benutzerprofil anzeigen
Gesponserte Inhalte




BeitragThema: Re: Noch eine SQL Knobelei   

Nach oben Nach unten
 

Noch eine SQL Knobelei

Vorheriges Thema anzeigen Nächstes Thema anzeigen Nach oben 
Seite 1 von 1

 Ähnliche Themen

-
» 2 Monate hinterhergelaufen

Befugnisse in diesem ForumSie können in diesem Forum nicht antworten
NWK-Forum :: Allgemeines-