Hallo ich ab mal wieder ein für mich unlösbares Problem.
Ich habe x Personen von denen jeder 30 unterschiedlichen Einzelergebnissen produziert.
Diese Einzelergebnisse sollen nach laufender Nummer zu Zwischensummen aus 10 Einzelergebnissen summiert werden
Die Zwischensummen möchte ich nach dem Zeitstempel ordnen.
Ausgangspunkt:Tabelle mit folgenden Spalten
| ID | Name | Nummer | Timestamp | Einzelergebnis |
with ergebnisse_x as (
select e.*
, ((e.nummer - 1) / 3) + 1 as runde
, case when mod(e.nummer, 3) = 0 then 1 else 0 end as zw_flag
, sum(einzelergebnis) over (partition by name, (e.nummer - 1) / 3 order by timestamp) as zw_sum
from ergebnisse e
)
select timestamp, name, runde, zw_sum
from ergebnisse_x
where zw_flag = 1
order by timestamp;
Dabei habe ich die Abfrage auf 3 Ergebnisse pro “Runde” eingekürzt, um nicht zu viele Testdaten generieren zu müssen. Das heißt du müsstes die 3 in der Abfrage durch eine 10 tauschen.
Im Prinzip berechne ich für jede Zeile die Zwischensumme durch die Windowing Funktion in der with Klausel.
Dann filtere ich nur die gewünschten Zwischenstops raus.
Hallo frastr vielen Dank für deine schnelle, übersichtliche, und reproduzierbare Hilfe
habe deine Lösung auf meine Tabellenstruktur angepasst und siehe da das Ergebnis
sieht genau so aus wie ich es brauche.
@ akreschmar werde mir deinen Lösungsweg auch anschauen und auf meine Daten umsetzen.
Auch dir Danke für deine Unterstützung
Mein letzter Post hat sich erledigt, mit bisschen Abstand löst sich vieles.
Aber wie ich die Spalte div mit 1 beginnen lassen kann ist mir noch unklar, wenn ich 1+ row_number schreibe bekomme ich seltsamerweise nur 30 Zeilen anstatt der tatsächlichen 40 Zeilen
****kann man die Lösung vom frastr um die Spalte flag erweitern wobei die flag “1” immer auf max(runde) group by Name gesetzt wird?
wäre super wenn da auch machbar wäre
Gruß Simar
with ergebnisse_x as (
select e.*
, ((e.nummer - 1) / 3) + 1 as runde
, case when mod(e.nummer, 3) = 0 then 1 else 0 end as zw_flag
, sum(einzelergebnis) over (partition by name, (e.nummer - 1) / 3 order by timestamp) as zw_sum
from ergebnisse e
)
select timestamp, name, runde, zw_sum
from ergebnisse_x
where zw_flag = 1
order by timestamp;
Du beginnst damit die Max() Funktion für die Spalte Runde zu verwenden.
Dann ergänzt Du nach und nach die restlichen Spalten für die Ausgabe.
Wenn Du nicht weiterkommst, nimmst Du deine Beispieldaten von oben und postest sie erneut mit dem zugehörigen Wunschergebnis und dem Fehler, den Du bei Deinem Versuch erhälst.
die suche nach Max( Runde) bringt mir unteres Ergebnis anstatt die als Wunsch angefügte Spalte
select *
,max(runde)
from
(
with x as (select *,
div(row_number() over (partition by id_training order by timestamp )-1, 10) as runde
from t_transfer,
t_namen
where
id_name = id_namen
and id_namen = id_namen
and id_typ =2
Hast Du schon mal Code Tags benutzt? Irgendwo? Hast Du Dich noch nie gefragt, wie andere ordentlich aussehende und verständliche Beiträge posten?
Zu Deiner Abfrage:
Wie soll ein Maximum von etwas ermittelt werden, wenn der nicht maximierte Wert mit ausgegeben wird?
Max() kann dann nichts anderes anzeigen als den Wert aus der aktuellen Zeile.
Lasse die Spalte “Runde” am Anfang der Select Clause weg. Konkret:
Entferne Select *
Ersetze es durch
Danke dir bei dem minnimierten Beispiel funktioniert es
hab aber übersehen dass dass ich noch diverse Bedingungen benötige die auf die Spalte Runde zugreifen
Mein Problem ich möchte etwas zusammenfassen und markieren und anschließend wieder trennen aber das geht so wohl nicht
muss mir etwas anderes überlegen
Das mit case hab ich, aber ich schaffe die Gruppierung nach dem höchsten Wert von Spalte runde pro Name nicht
Ich habe das mal so interpretiert, das du zusätzlichen Spalten möchtest, wo markiert ist:
Die beste Runde pro Spieler
Der beste Spieler pro Runde
Die beste Runde von allen
Ich habe es an meinen obigen Beispiel-Daten gemacht.
with ergebnisse_x as (
select e.*
, ((e.nummer - 1) / 3) + 1 as runde
, case when mod(e.nummer, 3) = 0 then 1 else 0 end as zw_flag
, sum(einzelergebnis) over (partition by name, (e.nummer - 1) / 3 order by timestamp) as zw_sum
from ergebnisse e
),
ergebnisse_x2 as (
select timestamp, name, runde, zw_sum
, case when max(zw_sum) over (partition by name) = zw_sum then 1 end as best_pro_user
, case when max(zw_sum) over (partition by runde) = zw_sum then 1 end as best_pro_runde
, case when max(zw_sum) over () = zw_sum then 1 end as best_pro_all
from ergebnisse_x
where zw_flag = 1
)
select *
from ergebnisse_x2
order by timestamp;
Im Prinzip habe ich eine 2. CTE ergebnisse_x2 eingebaut, welche die nötigen “erweiterten” Auswertung auf Basis von dem 1. CTE ergebnisse_x vornimmt.