Bagaimana saya bisa MEMILIH baris dengan MAX (nilai kolom), berbeda dengan kolom lain dalam SQL?

768

Meja saya adalah:

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

Saya perlu memilih masing-masing yang berbeda home memegang nilai maksimum datetime.

Hasilnya adalah:

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

Saya telah mencoba:

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

Tidak bekerja Hasil-set memiliki 130 baris meskipun database menampung 187. Hasil mencakup beberapa duplikat 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 

Nggak. Memberikan semua catatan.

-- 3 ..something exotic: 

Dengan berbagai hasil.

Kaptah
sumber

Jawaban:

940

Kamu sangat dekat! Yang perlu Anda lakukan adalah memilih KEDUA rumah dan waktu tanggal maksnya, kemudian bergabung kembali ke toptentabel pada bidang KEDUA:

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
Michael La Voie
sumber
5
Uji untuk berbeda, jika dua dat max sama berada di rumah yang sama (dengan pemain yang berbeda)
Maksym Gontar
5
Saya pikir cara klasik untuk melakukan ini adalah dengan bergabung secara alami: "SELECT tt. * FROM topten tt NATURAL JOIN (SELECT home, MAX (datetime) SEBAGAI datetime DARI topten GROUP BY home) paling baru;" Permintaan yang sama persis, tetapi bisa dibilang lebih mudah dibaca
Parker
32
bagaimana jika ada dua baris yang memiliki nilai bidang 'home' dan 'datetime' yang sama?
Kemal Duran
3
@Young masalah dengan permintaan Anda adalah bahwa ia mungkin kembali id, playerdan resourcebaris non-max untuk rumah yang diberikan yaitu untuk rumah = 10 Anda bisa mendapatkan: 3 | 10 | 04/03/2009 | john | 300 Dengan kata lain itu tidak menjamin bahwa semua kolom dari baris dalam resultset akan menjadi milik ke max (datetime) untuk rumah yang diberikan.
sactiw
1
@ me1111 masalah dengan permintaan Anda adalah bahwa ia mungkin / mungkin tidak mengembalikan baris ith max (datetime) untuk rumah yang diberikan. Alasannya adalah GROUP BY akan mengambil baris acak apa pun untuk setiap rumah dan ORDER BY hanya akan mengurutkan keseluruhan hasil yang dihasilkan oleh GROUP BY
sactiw
87

MySQLSolusi tercepat , tanpa pertanyaan dalam dan tanpa GROUP BY:

SELECT m.*                    -- get the row that contains the max value
FROM topten m                 -- "m" from "max"
    LEFT JOIN topten b        -- "b" from "bigger"
        ON m.home = b.home    -- match "max" row with "bigger" row by `home`
        AND m.datetime < b.datetime           -- want "bigger" than "max"
WHERE b.datetime IS NULL      -- keep only if there is no bigger than max

Penjelasan :

Gabung tabel dengan dirinya sendiri menggunakan homekolom. Penggunaan LEFT JOINmemastikan semua baris dari tabel mmuncul di set hasil. Mereka yang tidak memiliki kecocokan dalam tabel bakan memiliki NULLs untuk kolom b.

Kondisi lain pada permintaan JOINuntuk mencocokkan hanya baris dari byang memiliki nilai lebih besar pada datetimekolom daripada baris dari m.

Menggunakan data yang diposting dalam pertanyaan, LEFT JOINakan menghasilkan pasangan ini:

+------------------------------------------+--------------------------------+
|              the row from `m`            |    the matching row from `b`   |
|------------------------------------------|--------------------------------|
| id  home  datetime     player   resource | id    home   datetime      ... |
|----|-----|------------|--------|---------|------|------|------------|-----|
| 1  | 10  | 04/03/2009 | john   | 399     | NULL | NULL | NULL       | ... | *
| 2  | 11  | 04/03/2009 | juliet | 244     | NULL | NULL | NULL       | ... | *
| 5  | 12  | 04/03/2009 | borat  | 555     | NULL | NULL | NULL       | ... | *
| 3  | 10  | 03/03/2009 | john   | 300     | 1    | 10   | 04/03/2009 | ... |
| 4  | 11  | 03/03/2009 | juliet | 200     | 2    | 11   | 04/03/2009 | ... |
| 6  | 12  | 03/03/2009 | borat  | 500     | 5    | 12   | 04/03/2009 | ... |
| 7  | 13  | 24/12/2008 | borat  | 600     | 8    | 13   | 01/01/2009 | ... |
| 8  | 13  | 01/01/2009 | borat  | 700     | NULL | NULL | NULL       | ... | *
+------------------------------------------+--------------------------------+

Akhirnya, WHEREklausa menjaga hanya pasangan yang memiliki NULLs di kolom b(mereka ditandai dengan *dalam tabel di atas); ini berarti, karena kondisi kedua dari JOINklausa, baris yang dipilih dari mmemiliki nilai terbesar dalam kolom datetime.

Baca SQL Antipatterns: Menghindari Jebakan buku Pemrograman Database untuk tips SQL lainnya.

aksioma
sumber
Dengan SQLite, yang pertama jauh lebih lambat dari versi La Voie ketika tidak ada indeks pada kolom yang cocok (yaitu "rumah"). (Diuji dengan baris 24k menghasilkan baris
13k
10
Ini adalah jawaban terbaik, jika Anda menunjukkan rencana eksekusi, Anda akan melihat satu langkah lebih sedikit dengan kueri ini
TlmaK0
apa yang akan terjadi jika 2 baris memiliki yang sama homedan datetimedan datetimeadalah maksimum untuk yang khusus itu home?
Istiaque Ahmed
Kedua baris muncul di set hasil. Jawaban ini adalah bukti konsep. Dalam kode asli Anda, Anda mungkin memiliki kriteria lain untuk memilih hanya satu dari mereka dalam situasi ini (mungkin yang pertama atau yang terakhir atau Anda menggunakan kolom lain untuk memutuskan). Tambahkan saja kriteria ini sebagai kondisi baru dalam ONklausa. Fe ... ON ... AND m.id < b.iduntuk menjaga entri terbaru (yang memiliki terbesar id) ketika dua baris memiliki nilai homedan datetimekolom yang sama dan itu adalah maksimum datetime.
aksioma
Indeks apa yang paling optimal untuk kueri seperti ini?
AjaxLeung
73

Ini dia versi T-SQL :

-- Test data
DECLARE @TestTable TABLE (id INT, home INT, date DATETIME, 
  player VARCHAR(20), resource INT)
INSERT INTO @TestTable
SELECT 1, 10, '2009-03-04', 'john', 399 UNION
SELECT 2, 11, '2009-03-04', 'juliet', 244 UNION
SELECT 5, 12, '2009-03-04', 'borat', 555 UNION
SELECT 3, 10, '2009-03-03', 'john', 300 UNION
SELECT 4, 11, '2009-03-03', 'juliet', 200 UNION
SELECT 6, 12, '2009-03-03', 'borat', 500 UNION
SELECT 7, 13, '2008-12-24', 'borat', 600 UNION
SELECT 8, 13, '2009-01-01', 'borat', 700

-- Answer
SELECT id, home, date, player, resource 
FROM (SELECT id, home, date, player, resource, 
    RANK() OVER (PARTITION BY home ORDER BY date DESC) N
    FROM @TestTable
)M WHERE N = 1

-- and if you really want only home with max date
SELECT T.id, T.home, T.date, T.player, T.resource 
    FROM @TestTable T
INNER JOIN 
(   SELECT TI.id, TI.home, TI.date, 
        RANK() OVER (PARTITION BY TI.home ORDER BY TI.date) N
    FROM @TestTable TI
    WHERE TI.date IN (SELECT MAX(TM.date) FROM @TestTable TM)
)TJ ON TJ.N = 1 AND T.id = TJ.id

EDIT
Sayangnya, tidak ada fungsi RANK () OVER di MySQL.
Tapi itu bisa ditiru, lihat Fungsi Emulasi Analytic (Peringkat AKA) dengan MySQL .
Jadi ini adalah versi MySQL :

SELECT id, home, date, player, resource 
FROM TestTable AS t1 
WHERE 
    (SELECT COUNT(*) 
            FROM TestTable AS t2 
            WHERE t2.home = t1.home AND t2.date > t1.date
    ) = 0
Maksym Gontar
sumber
Maaf Bung, # 1064 - Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan dekat '() LEBIH (PARTISI DENGAN krd ORDER DENGAN DESC siang hari) N DARI @rapsa) M DIMANA N =' pada baris 1
Kaptah
2
ah, jadi Anda menggunakan MySQL. Itulah yang harus Anda mulai dari! Saya akan segera memperbarui jawaban.
Maksym Gontar
@ Maxgontar, batu solusi mysql Anda, thx. bagaimana jika di @_TestTable Anda Anda menghapus baris # 1>: SELECT 1, 10, '2009-03-04', 'john', 399, ini, bagaimana jika Anda memiliki satu baris untuk nilai rumah yang diberikan? Terima kasih.
egidiocs
2
BUG: Ganti "RANK ()" dengan "ROW_NUMBER ()". Jika Anda memiliki dasi (disebabkan oleh nilai tanggal duplikat) Anda akan memiliki dua catatan dengan "1" untuk N.
MikeTeeVee
29

Ini akan berfungsi bahkan jika Anda memiliki dua atau lebih baris untuk masing-masing homedengan yang sama DATETIME:

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
Quassnoi
sumber
menambahkan bidang tutup dalam tabel, No Good
Kaptah
1
Yang ini tidak dieksekusi di PHPMyAdmin. Halaman disegarkan tetapi tidak ada hasil atau kesalahan ..?
Kaptah
WHERE ti.home = t1.home- bisakah Anda menjelaskan sintaksnya?
Istiaque Ahmed
@IstiaqueAhmed: apa sebenarnya yang tidak Anda mengerti di sini? Ini kueri yang berkorelasi, dan ekspresi yang Anda sebutkan adalah kondisi korelasi.
Quassnoi
@Quassnoi, selectPermintaan yang memiliki garis WHERE ti.home = t1.home tidak perlu FROMklausa yang mendefinisikan t1. Jadi bagaimana ini digunakan?
Istiaque Ahmed
26

Saya pikir ini akan memberi Anda hasil yang diinginkan:

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

TETAPI jika Anda membutuhkan kolom lain juga, cukup gabung dengan tabel asli (periksa Michael La Voiejawaban)

Salam Hormat.

Ricardo Felgueiras
sumber
8
Dia membutuhkan kolom lain juga.
Quassnoi
4
id, rumah, datetime, pemain, sumber daya
Quassnoi
17

Karena orang-orang tampaknya terus mengikuti utas ini (tanggal komentar berkisar 1,5 tahun) tidak semudah ini:

SELECT * FROM (SELECT * FROM topten ORDER BY datetime DESC) tmp GROUP BY home

Tidak diperlukan fungsi agregasi ...

Bersulang.

MJB
sumber
6
Ini sepertinya tidak berhasil. Pesan Galat: Kolom 'x' tidak valid di daftar pilih karena tidak terkandung dalam fungsi agregat atau klausa GROUP BY.
Fowl
Ini jelas tidak akan bekerja di SQL Server atau Oracle, meskipun sepertinya itu bekerja di MySQL.
ErikE
Ini sangat indah! Bagaimana cara kerjanya? Dengan menggunakan DESC dan kolom pengembalian grup default? Jadi jika saya mengubahnya ke datetime ASC, itu akan mengembalikan baris paling awal untuk setiap rumah?
wayofthutureure
Ini brilian!
Pencinta Anjing
Straight-up ini tidak berfungsi jika Anda memiliki kolom yang tidak teragregasi (di MySQL).
user3562927
11

Anda juga dapat mencoba yang satu ini dan untuk tabel besar kinerja query akan lebih baik. Ini berfungsi ketika tidak ada lebih dari dua catatan untuk setiap rumah dan tanggalnya berbeda. Permintaan MySQL umum yang lebih baik adalah satu dari Michael La Voie di atas.

SELECT t1.id, t1.home, t1.date, t1.player, t1.resource
FROM   t_scores_1 t1 
INNER JOIN t_scores_1 t2
   ON t1.home = t2.home
WHERE t1.date > t2.date

Atau dalam kasus Postgres atau db yang menyediakan fungsi analitik coba

SELECT t.* FROM 
(SELECT t1.id, t1.home, t1.date, t1.player, t1.resource
  , row_number() over (partition by t1.home order by t1.date desc) rw
 FROM   topten t1 
 INNER JOIN topten t2
   ON t1.home = t2.home
 WHERE t1.date > t2.date 
) t
WHERE t.rw = 1
Siwa
sumber
Apakah jawaban ini benar? Saya mencoba menggunakannya, tetapi sepertinya tidak untuk memilih catatan dengan tanggal terbaru untuk 'rumah', tetapi hanya menghapus catatan dengan tanggal terlama. Berikut ini contohnya: SQLfiddle
marcin93w
1
@kidOfDeath - Memperbarui balasan saya dengan konteks dan permintaan Postgres
Shiva
Dengan SQLite, yang pertama jauh lebih lambat dari versi La Voie ketika tidak ada indeks pada kolom yang cocok (yaitu "rumah").
Thomas Tempelmann
8

Ini berfungsi pada Oracle:

with table_max as(
  select id
       , home
       , datetime
       , player
       , resource
       , max(home) over (partition by home) maxhome
    from table  
)
select id
     , home
     , datetime
     , player
     , resource
  from table_max
 where home = maxhome
FerranB
sumber
1
bagaimana cara memilih datetime max? ia diminta untuk mengelompokkan berdasarkan rumah, dan memilih dat dat max. Saya tidak mengerti bagaimana ini bisa terjadi.
n00b
8
SELECT  tt.*
FROM    TestTable tt 
INNER JOIN 
        (
        SELECT  coord, MAX(datetime) AS MaxDateTime 
        FROM    rapsa 
        GROUP BY
                krd 
        ) groupedtt
ON      tt.coord = groupedtt.coord
        AND tt.datetime = groupedtt.MaxDateTime
Kaptah
sumber
8

Coba ini untuk SQL Server:

WITH cte AS (
   SELECT home, MAX(year) AS year FROM Table1 GROUP BY home
)
SELECT * FROM Table1 a INNER JOIN cte ON a.home = cte.home AND a.year = cte.year
SysDragon
sumber
5
SELECT c1, c2, c3, c4, c5 FROM table1 WHERE c3 = (select max(c3) from table)

SELECT * FROM table1 WHERE c3 = (select max(c3) from table1)
Jr.
sumber
5

Berikut adalah versi MySQL yang mencetak hanya satu entri di mana ada duplikat MAX (datetime) dalam sebuah grup.

Anda bisa menguji di sini http://www.sqlfiddle.com/#!2/0a4ae/1

Contoh data

mysql> SELECT * from topten;
+------+------+---------------------+--------+----------+
| id   | home | datetime            | player | resource |
+------+------+---------------------+--------+----------+
|    1 |   10 | 2009-04-03 00:00:00 | john   |      399 |
|    2 |   11 | 2009-04-03 00:00:00 | juliet |      244 |
|    3 |   10 | 2009-03-03 00:00:00 | john   |      300 |
|    4 |   11 | 2009-03-03 00:00:00 | juliet |      200 |
|    5 |   12 | 2009-04-03 00:00:00 | borat  |      555 |
|    6 |   12 | 2009-03-03 00:00:00 | borat  |      500 |
|    7 |   13 | 2008-12-24 00:00:00 | borat  |      600 |
|    8 |   13 | 2009-01-01 00:00:00 | borat  |      700 |
|    9 |   10 | 2009-04-03 00:00:00 | borat  |      700 |
|   10 |   11 | 2009-04-03 00:00:00 | borat  |      700 |
|   12 |   12 | 2009-04-03 00:00:00 | borat  |      700 |
+------+------+---------------------+--------+----------+

Versi MySQL dengan variabel Pengguna

SELECT *
FROM (
    SELECT ord.*,
        IF (@prev_home = ord.home, 0, 1) AS is_first_appear,
        @prev_home := ord.home
    FROM (
        SELECT t1.id, t1.home, t1.player, t1.resource
        FROM topten t1
        INNER JOIN (
            SELECT home, MAX(datetime) AS mx_dt
            FROM topten
            GROUP BY home
          ) x ON t1.home = x.home AND t1.datetime = x.mx_dt
        ORDER BY home
    ) ord, (SELECT @prev_home := 0, @seq := 0) init
) y
WHERE is_first_appear = 1;
+------+------+--------+----------+-----------------+------------------------+
| id   | home | player | resource | is_first_appear | @prev_home := ord.home |
+------+------+--------+----------+-----------------+------------------------+
|    9 |   10 | borat  |      700 |               1 |                     10 |
|   10 |   11 | borat  |      700 |               1 |                     11 |
|   12 |   12 | borat  |      700 |               1 |                     12 |
|    8 |   13 | borat  |      700 |               1 |                     13 |
+------+------+--------+----------+-----------------+------------------------+
4 rows in set (0.00 sec)

Outout Jawaban yang Diterima

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
+------+------+---------------------+--------+----------+
| id   | home | datetime            | player | resource |
+------+------+---------------------+--------+----------+
|    1 |   10 | 2009-04-03 00:00:00 | john   |      399 |
|    2 |   11 | 2009-04-03 00:00:00 | juliet |      244 |
|    5 |   12 | 2009-04-03 00:00:00 | borat  |      555 |
|    8 |   13 | 2009-01-01 00:00:00 | borat  |      700 |
|    9 |   10 | 2009-04-03 00:00:00 | borat  |      700 |
|   10 |   11 | 2009-04-03 00:00:00 | borat  |      700 |
|   12 |   12 | 2009-04-03 00:00:00 | borat  |      700 |
+------+------+---------------------+--------+----------+
7 rows in set (0.00 sec)
Jason Heo
sumber
Meskipun saya suka jawaban ini, karena ini sangat membantu saya, saya harus menunjukkan satu kelemahan utama, yang bergantung pada sistem mysql yang digunakan. Pada dasarnya, solusi ini bergantung pada klausa ORDER BY dalam subselect. MUNGKIN ini, atau MUNGKIN TIDAK bekerja di berbagai lingkungan mysql. Saya belum mencobanya di MySQL murni, tetapi pasti ini tidak bekerja DAPAT DIANDALKAN pada MariaDB 10.1, seperti yang dijelaskan di sini stackoverflow.com/questions/26372511/... tetapi kode yang sama tidak berfungsi baik pada Percona Server. Lebih tepatnya, Anda MUNGKIN, atau MUNGKIN TIDAK mendapatkan hasil yang sama, tergantung pada jumlah t1 kolom.
Radek
Contoh untuk pernyataan ini adalah, bahwa pada MariaDB 10.1 berfungsi, ketika saya menggunakan 5 kolom dari tabel t1. Segera setelah saya menambahkan kolom keenam, jelas mengacaukan pengurutan data "alami" dalam tabel asli, itu berhenti bekerja. Alasannya adalah, data dalam subselect menjadi tidak terurut dan dengan demikian saya memiliki kondisi "is_first_appear = 1" bertemu beberapa kali. Kode yang sama, dengan data yang sama, bekerja pada Percona ok.
Radek
5

Cara lain untuk mendapatkan baris terbaru per grup menggunakan sub kueri yang pada dasarnya menghitung peringkat untuk setiap baris per grup dan kemudian menyaring baris terbaru Anda dengan peringkat = 1

select a.*
from topten a
where (
  select count(*)
  from topten b
  where a.home = b.home
  and a.`datetime` < b.`datetime`
) +1 = 1

DEMO

Berikut ini adalah demo visual untuk peringkat no untuk setiap baris untuk pemahaman yang lebih baik

Dengan membaca beberapa komentar, bagaimana jika ada dua baris yang memiliki nilai bidang 'home' dan 'datetime' yang sama?

Kueri di atas akan gagal dan akan mengembalikan lebih dari 1 baris untuk situasi di atas. Untuk menutupi situasi ini akan diperlukan kriteria / parameter / kolom lain untuk memutuskan baris mana yang harus diambil yang berada dalam situasi di atas. Dengan melihat kumpulan data sampel, saya berasumsi ada kolom kunci utama idyang harus disetel ke kenaikan otomatis. Jadi kita bisa menggunakan kolom ini untuk memilih baris terbaru dengan mengubah kueri yang sama dengan bantuan CASEpernyataan seperti

select a.*
from topten a
where (
  select count(*)
  from topten b
  where a.home = b.home
  and  case 
       when a.`datetime` = b.`datetime`
       then a.id < b.id
       else a.`datetime` < b.`datetime`
       end
) + 1 = 1

DEMO

Kueri di atas akan memilih baris dengan id tertinggi di antara yang sama datetime nilai-nilai

demo visual untuk peringkat no untuk setiap baris

M Khalid Junaid
sumber
2

Mengapa tidak menggunakan: SELECT home, MAX (datetime) SEBAGAI MaxDateTime, pemain, sumber daya DARI topten GROUP BY home Apakah saya melewatkan sesuatu?

Roland
sumber
4
Itu hanya akan valid dengan MySQL, dan hanya versi sebelum 5.7 (?) Atau setelah 5.7 dengan ONLY_FULL_GROUP_BY dinonaktifkan, karena itu adalah SELECTing kolom yang belum dikumpulkan / dikelompokkan (pemain, sumber daya) yang berarti MySQL akan memberikan nilai yang dipilih secara acak untuk mereka dua bidang hasil. Itu tidak akan menjadi masalah untuk kolom pemain karena itu berkorelasi dengan kolom home, tetapi kolom resource tidak akan berkorelasi dengan home atau kolom datetime dan Anda tidak bisa menjamin nilai sumber daya mana yang akan Anda terima.
simpleuser
+1 untuk penjelasan, TETAPI pertanyaan yang diajukan pertanyaan ini tidak akan mengembalikan expectedoutput dalam versi MySQL 5.6 dan beforedan saya sangat meragukannya untuk berperilaku sebaliknya dalam versi MySQL 5.7 dan after.
sactiw
@simpleuser, `Ini tidak akan menjadi masalah bagi kolom pemain karena itu berkorelasi dengan kolom home` - dapatkah Anda menjelaskan lebih lanjut?
Istiaque Ahmed
@IstiaqueAhmed saat saya melihatnya lagi, pernyataan itu salah. Saya pikir setiap pemain selalu memiliki nilai rumah yang sama, tetapi saya melihat sekarang bahwa mereka tidak, sehingga masalah pilih acak yang sama akan terjadi untuk kolom itu juga
sederhana
1

Coba ini

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

Salam K

Khb
sumber
5
Uji untuk berbeda, jika dua dat max sama berada di rumah yang sama (dengan pemain yang berbeda)
Maksym Gontar
alias untuk max(datetime) is datetime. Tidak akan membuat masalah?
Istiaque Ahmed
Bagaimana yang tertinggi datetimedipilih?
Istiaque Ahmed
1

ini permintaan yang Anda butuhkan:

 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;
Vijunav Vastivch
sumber
dapatkah Anda menjelaskan jawaban Anda?
Istiaque Ahmed
1

@Michae Jawaban yang diterima akan berfungsi dengan baik di sebagian besar kasus tetapi gagal untuk satu seperti di bawah ini.

Jika ada 2 baris yang memiliki HomeID dan Datetime yang sama, kueri akan mengembalikan kedua baris, bukan HomeID yang berbeda seperti yang diperlukan, untuk itu tambahkan Perbedaan dalam kueri seperti di bawah ini.

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
Manoj Kargeti
sumber
hasil menunjukkan - "# 1054 - Kolom tidak dikenal 'tt.MaxDateTime' dalam 'daftar bidang'"
Istiaque Ahmed
@IstiaqueAhmed apakah Anda memiliki MaxDatetime diajukan yaitu setiap nama kolom seperti itu ..?
Manoj Kargeti
Tidak, tabel di OP tidak memiliki kolom seperti itu.
Istiaque Ahmed
kesalahan juga mengatakan hal yang sama tolong..apa sebenarnya yang ingin kamu lakukan? dapatkah Anda mengirim struktur tabel dan permintaan Anda.
Manoj Kargeti
1

Berharap query di bawah ini akan memberikan output yang diinginkan:

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