Πώς μπορώ να ΕΠΙΛΕΞΩ γραμμές με MAX(τιμή στήλης), DISTINCT από άλλη στήλη στην SQL;

Το τραπέζι μου είναι:

id  home  datetime     player   resource
---|-----|------------|--------|---------
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

Θέλω να επιλέξω κάθε ξεχωριστή home που κατέχει τη μέγιστη τιμή της datetime.

Το αποτέλεσμα θα είναι:

id  home  datetime     player   resource 
---|-----|------------|--------|---------
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

Έχω δοκιμάσει:

-- 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

Δεν λειτουργεί. Το σύνολο αποτελεσμάτων έχει 130 σειρές αν και η βάση δεδομένων περιέχει 187. Το αποτέλεσμα περιλαμβάνει μερικά αντίγραφα του 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 

Όχι. Δίνει όλες τις εγγραφές.

-- 3 ..something exotic: 

Με διάφορα αποτελέσματα.

Λύση

Είστε τόσο κοντά! Το μόνο που χρειάζεται να κάνετε είναι να επιλέξετε και τα δύο πεδία της κατοικίας και την μέγιστη ημερομηνία και στη συνέχεια να συνδεθείτε με τον πίνακα "topten" και στα δύο πεδία:

SELECT tt.*
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
Σχόλια (22)

Αυτό θα λειτουργήσει ακόμη και αν έχετε δύο ή περισσότερες γραμμές για κάθε home με ίσες DATETIME's:

SELECT id, home, datetime, player, resource
FROM   (
       SELECT (
              SELECT  id
              FROM    topten ti
              WHERE   ti.home = t1.home
              ORDER BY
                      ti.datetime DESC
              LIMIT 1
              ) lid
       FROM   (
              SELECT  DISTINCT home
              FROM    topten
              ) t1
       ) ro, topten t2
WHERE  t2.id = ro.lid
Σχόλια (8)

Νομίζω ότι αυτό θα σας δώσει το επιθυμητό αποτέλεσμα:

SELECT   home, MAX(datetime)
FROM     my_table
GROUP BY home

ΑΛΛΑ αν χρειάζεστε και άλλες στήλες, απλά κάντε μια σύνδεση με τον αρχικό πίνακα (δείτε την απάντηση του "Michael La Voie")

Με τους καλύτερους χαιρετισμούς.

Σχόλια (3)