NWK-Forum
Würden Sie gerne auf diese Nachricht reagieren? Erstellen Sie einen Account in wenigen Klicks oder loggen Sie sich ein, um fortzufahren.

Klärt auf, wäscht up.
 
StartseiteStartseite  Neueste BilderNeueste Bilder  SuchenSuchen  AnmeldenAnmelden  LoginLogin  

Teilen
 

 Noch eine SQL Knobelei

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


Anzahl der Beiträge : 651
Anmeldedatum : 20.05.12

Noch eine SQL Knobelei Empty
BeitragThema: Noch eine SQL Knobelei   Noch eine SQL Knobelei EmptySo 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
Nach oben Nach unten
Lord Helmchen
Captain
Lord Helmchen


Anzahl der Beiträge : 651
Anmeldedatum : 20.05.12

Noch eine SQL Knobelei Empty
BeitragThema: Re: Noch eine SQL Knobelei   Noch eine SQL Knobelei EmptySo 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
Nach oben Nach unten
Lord Helmchen
Captain
Lord Helmchen


Anzahl der Beiträge : 651
Anmeldedatum : 20.05.12

Noch eine SQL Knobelei Empty
BeitragThema: Re: Noch eine SQL Knobelei   Noch eine SQL Knobelei EmptySo 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
Nach oben Nach unten
Lord Helmchen
Captain
Lord Helmchen


Anzahl der Beiträge : 651
Anmeldedatum : 20.05.12

Noch eine SQL Knobelei Empty
BeitragThema: Re: Noch eine SQL Knobelei   Noch eine SQL Knobelei EmptySo 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
Nach oben Nach unten
Gesponserte Inhalte




Noch eine SQL Knobelei Empty
BeitragThema: Re: Noch eine SQL Knobelei   Noch eine SQL Knobelei Empty

Nach oben Nach unten
 

Noch eine SQL Knobelei

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

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