Hier ist eine Tabelle
ID | Player | Position | Points
1 | Ryan | QB | 75
2 | Matt | RB | 80
3 | Mike | WR | 66
4 | Jay | QB | 71
6 | Alvin | TE | 73
7 | Adrian | TE | 84
8 | Hill | WR | 71
9 | Charles| RB | 53
10 | Bell | WR | 87
11 | Rob | TE | 49
12 | Alex | RB | 92
13 | Drew | QB | 84
14 | Mack | TE | 59
15 | Nick | WR | 33
Ich möchte alle Spieler auf der Position des Spielers mit den höchsten Punkten und die besten 2 Spieler der anderen Positionen melden. In diesem Beispiel hat "Alex" die höchsten Punkte und ist ein "RB". Ich möchte also alle Spieler aus "RB" und Top 2 aus "QB", "TE", "WR" melden und nach Punkten mit in jeder Gruppe ordnen. Ich benutze sqlite3. Ich kann dies programmgesteuert mit Python und sqlite3 tun, aber ich habe mich gefragt, ob dies nur mit sql möglich ist
ID | Player | Position | Points
12 | Alex | RB | 92
2 | Matt | RB | 80
9 | Charles| RB | 53
13 | Drew | QB | 84
1 | Ryan | QB | 75
10 | Bell | WR | 87
8 | Hill | WR | 71
7 | Adrian | TE | 84
6 | Alvin | TE | 73
Danke für Ihre Hilfe
Dies ist in "traditionellem" SQLite schwierig. Ich würde empfehlen union all
:
with top1 as (
select t.*
from t
order by points desc
limit 1
)
select t.*
from t
where t.position = (select t1.position from top1 t1)
union all
select t.*
from t
where t.position <> (select t1.position from top1 t1) and
(select count(*)
from t t2
where t2.position = t.position and
t2.points >= t.points
) <= 2;
Dies setzt voraus, dass die points
Werte eindeutig sind. Bindungen sind in SQLite viel schwieriger zu handhaben.
Ich könnte Ihnen empfehlen, ein Upgrade auf SQLite Version 3.25.0 in Betracht zu ziehen oder eine andere Datenbank zu verwenden. Eine solche Abfrage wäre mit ISO/ANSI-Standardfensterfunktionen viel einfacher.
Mit Fensterfunktionen würde es so aussehen:
select t.*
from (select t.*,
row_number() over (partition by position order by points desc) as seqnum,
first_value(position) over (order by points desc) as first_position
from t
) t
where seqnum <= 2 or position = first_position
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen