909 Stimmen

Wie kann ich SELECT Zeilen mit MAX(Spaltenwert), PARTITION durch eine andere Spalte in MYSQL?

Mein Tisch ist:

id

Startseite

datetime

Spieler

Ressource

1

10

04/03/2009

john

399

2

11

04/03/2009

juliet

244

5

12

04/03/2009

borat

555

3

10

03/03/2009

john

300

4

11

03/03/2009

juliet

200

6

12

03/03/2009

borat

500

7

13

24/12/2008

borat

600

8

13

01/01/2009

borat

700

Ich muss jedes einzelne Element auswählen home die den maximalen Wert von datetime .

Das Ergebnis wäre:

id

Startseite

datetime

Spieler

Ressource

1

10

04/03/2009

john

399

2

11

04/03/2009

juliet

244

5

12

04/03/2009

borat

555

8

13

01/01/2009

borat

700

Ich habe es versucht:

-- 1 ..by the MySQL manual: 

SELECT DISTINCT
  home,
  id,
  datetime AS dt,
  player,
  resource
FROM topten t1
WHERE datetime = (SELECT
  MAX(t2.datetime)
FROM topten t2
GROUP BY home)
GROUP BY datetime
ORDER BY datetime DESC

Funktioniert nicht. Die Ergebnismenge hat 130 Zeilen, obwohl die Datenbank 187 Zeilen enthält. Das Ergebnis enthält einige Duplikate von home .

-- 2 ..join

SELECT
  s1.id,
  s1.home,
  s1.datetime,
  s1.player,
  s1.resource
FROM topten s1
JOIN (SELECT
  id,
  MAX(datetime) AS dt
FROM topten
GROUP BY id) AS s2
  ON s1.id = s2.id
ORDER BY datetime 

Nö. Es gibt alle Aufzeichnungen.

-- 3 ..something exotic: 

Mit unterschiedlichen Ergebnissen.

0 Stimmen

2voto

Khb Punkte 1393

Versuchen Sie dies

select * from mytable a join
(select home, max(datetime) datetime
from mytable
group by home) b
 on a.home = b.home and a.datetime = b.datetime

Mit freundlichen Grüßen K

5 Stimmen

Testen Sie, ob zwei gleiche max datetime im gleichen Haus sind (mit verschiedenen Spielern)

0 Stimmen

Der Alias für max(datetime) es datetime . Wird das kein Problem darstellen?

0 Stimmen

Wie ist die höchste datetime ausgewählt ?

2voto

Manoj Kargeti Punkte 161

@Michae Die akzeptierte Antwort funktioniert in den meisten Fällen gut, aber in einem Fall schlägt sie fehl, wie unten beschrieben.

Im Falle, wenn es 2 Zeilen mit HomeID und Datetime gleich die Abfrage zurückgegeben werden beide Zeilen, nicht eindeutig HomeID wie erforderlich, für die Distinct in Abfrage wie unten hinzufügen.

SELECT DISTINCT tt.home  , tt.MaxDateTime
FROM topten tt
INNER JOIN
    (SELECT home, MAX(datetime) AS MaxDateTime
    FROM topten
    GROUP BY home) groupedtt 
ON tt.home = groupedtt.home 
AND tt.datetime = groupedtt.MaxDateTime

0 Stimmen

Ergebnis zeigt - "#1054 - Unbekannte Spalte 'tt.MaxDateTime' in 'Feldliste'"

0 Stimmen

@IstiaqueAhmed haben Sie die Spalte MaxDatetime, d.h. irgendeinen Spaltennamen wie den abgelegt?

0 Stimmen

Nein, die Tabelle im OP hat keine solche Spalte.

1voto

Vijunav Vastivch Punkte 4075

Dies ist die Abfrage, die Sie benötigen:

 SELECT b.id, a.home,b.[datetime],b.player,a.resource FROM
 (SELECT home,MAX(resource) AS resource FROM tbl_1 GROUP BY home) AS a

 LEFT JOIN

 (SELECT id,home,[datetime],player,resource FROM tbl_1) AS b
 ON  a.resource = b.resource WHERE a.home =b.home;

0 Stimmen

Können Sie Ihre Antwort erläutern?

1voto

kiruba Punkte 73

Ich hoffe, dass die folgende Abfrage das gewünschte Ergebnis liefert:

Select id, home,datetime,player,resource, row_number() over (Partition by home ORDER by datetime desc) as rownum from tablename where rownum=1

0voto

Moradnejad Punkte 2977

(HINWEIS: Die Antwort von Michael ist perfekt für eine Situation, in der die Zielspalte datetime kann keine doppelten Werte für jeden einzelnen home .)

Wenn Ihr Tisch eine doppelte Zeilen für home x datetime und Sie müssen nur eine Zeile für jede einzelne Zeile auswählen home Spalte Hier ist meine Lösung für dieses Problem:

Ihre Tabelle benötigt eine eindeutige Spalte (wie id ). Wenn dies nicht der Fall ist, erstellen Sie eine Ansicht und fügen Sie ihr eine zufällige Spalte hinzu.

Verwenden Sie diese Abfrage, um eine einzelne Zeile für jede eindeutige home Wert. Wählt den niedrigsten id im Falle eines Duplikats datetime .

SELECT tt.*
FROM topten tt
INNER JOIN
    (
    SELECT min(id) as min_id, home from topten tt2
    INNER JOIN 
        (
        SELECT home, MAX(datetime) AS MaxDateTime
        FROM topten
        GROUP BY home) groupedtt2
    ON tt2.home = groupedtt2.home
    ) as groupedtt
ON tt.id = groupedtt.id

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X