Order by timestamp

Fragen und Probleme rund um die Abfragespache SQL.
pogomips
Erfahrener Benutzer
Beiträge: 136
Registriert: Fr 18. Nov 2016, 09:55

Re: Order by timestamp

Beitrag von pogomips »

simar hat geschrieben:
Sa 21. Mär 2020, 11:47
ich schaffe die Gruppierung nach dem höchsten Wert von Spalte runde pro Name nicht
Die Formulierung deutet auf einen Denkfehler hin.

Es wird nach Werten gruppiert, die identisch sind, nicht nach höchsten oder was auch immer Werten.

Alle Werte, die nicht identisch sind, werden demnach separat ausgegeben, in immer neuen Zeilen, natürlich noch in Kombination mit den verschiedenen Werten der übrigen Spalten.

Höchste Werte, aus einer Menge von unterschiedlichen Werten, findet man durch die Funktion MAX().

simar
Benutzer
Beiträge: 92
Registriert: Di 9. Okt 2018, 17:40

Re: Order by timestamp

Beitrag von simar »

Ich kenne mich zuwenig aus um dir zu widerspechen, wie könnte dann eine Lösung aussehen dass ich zum Ziel komme.

pogomips
Erfahrener Benutzer
Beiträge: 136
Registriert: Fr 18. Nov 2016, 09:55

Re: Order by timestamp

Beitrag von pogomips »

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.

simar
Benutzer
Beiträge: 92
Registriert: Di 9. Okt 2018, 17:40

Re: Order by timestamp

Beitrag von simar »

Aktuelle Situation

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

and CAST(timestamp AS VARCHAR ) > '2020-03-%'

)
select
runde,
name,
vorname,
id_training

from x

) nn
group by
id_training,
runde,
name,
vorname

Runde |Name|Vorname|Training|max WUNSCH
"0" "Groll" "Oli" 3272 "0" |0
"1" "Groll" "Oli" 3272 "1" |0
"2" "Groll" "Oli" 3272 "2" |0
"3" "Groll" "Oli" 3272 "3" |1
"0" "Maier" "Horst" 3273 "0" |0
"1" "Maier" "Horst" 3273 "1" |0
"2" "Maier" "Horst" 3273 "2" |1
"0" "Müller" "Güni" 3274 "0" |0
"1" "Müller" "Güni" 3274 "1" |1
"2" "Müller" "Günther" 3274 "2"

pogomips
Erfahrener Benutzer
Beiträge: 136
Registriert: Fr 18. Nov 2016, 09:55

Re: Order by timestamp

Beitrag von pogomips »

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

Code: Alles auswählen

Select name, vorname, id_training
passe Group By entsprechend an.

simar
Benutzer
Beiträge: 92
Registriert: Di 9. Okt 2018, 17:40

Re: Order by timestamp

Beitrag von simar »

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

frastr
Benutzer
Beiträge: 48
Registriert: Di 9. Sep 2014, 12:20
Wohnort: Hoyerswerda, Sachsen

Re: Order by timestamp

Beitrag von frastr »

Hallo simar,
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.

Code: Alles auswählen

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.

Das Ergebnis sieht dann so aus:

Code: Alles auswählen

        timestamp    |  name   | runde | zw_sum | best_pro_user | best_pro_runde | best_pro_all
---------------------+---------+-------+--------+---------------+----------------+--------------
 2020-01-01 10:03:21 | Meier   |     1 |     29 |             1 |              1 |             
 2020-01-01 10:04:15 | Meier   |     2 |     27 |               |                |             
 2020-01-01 10:05:10 | Lehmann |     1 |     27 |               |                |             
 2020-01-01 10:06:04 | Lehmann |     2 |     31 |             1 |              1 |            1
 2020-01-01 10:06:59 | Schulze |     1 |     24 |               |                |             
 2020-01-01 10:07:53 | Schulze |     2 |     29 |             1 |                |             
(6 Zeilen)
Gruß frastr

Antworten