| | Autor | Nachricht |
---|
Lord Helmchen Captain
Anzahl der Beiträge : 651 Anmeldedatum : 20.05.12
| Thema: 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
|
| | | Lord Helmchen Captain
Anzahl der Beiträge : 651 Anmeldedatum : 20.05.12
| Thema: 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 |
| | | Lord Helmchen Captain
Anzahl der Beiträge : 651 Anmeldedatum : 20.05.12
| Thema: 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 |
| | | Lord Helmchen Captain
Anzahl der Beiträge : 651 Anmeldedatum : 20.05.12
| Thema: 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 |
| | | Gesponserte Inhalte
| Thema: Re: Noch eine SQL Knobelei | |
| |
| | | |
| Befugnisse in diesem Forum | Sie können in diesem Forum nicht antworten
| |
| |
| |