Lebih
Bagaimana saya bisa MEMILIH baris dengan MAX(Kolom nilai), yang BERBEDA dengan kolom lain dalam SQL?
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 untuk memilih masing-masing berbeda rumah
memegang nilai maksimum datetime
.
Hasilnya akan menjadi:
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
Doesn't bekerja. Hasil-set memiliki 130 baris meskipun database memegang 187.
Hasil mencakup beberapa duplikat dari rumah
.
-- 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
Nope. Memberikan semua catatan.
-- 3 ..something exotic:
Dengan berbagai hasil.
724
17
Anda begitu dekat! Semua yang perlu anda lakukan adalah memilih INVESTASI rumah dan max tanggal waktu, kemudian bergabung kembali ke
topten
meja di KEDUA bidang:Di sini berlaku T-SQL versi:
EDIT Sayangnya, tidak ada PANGKAT() ALIH fungsi di MySQL. Tapi itu bisa ditiru, lihat Meniru Analisis (AKA Peringkat) Fungsi dengan MySQL. Jadi, ini adalah MySQL versi:
Tercepat
MySQL
solusi, tanpa inner query dan tanpaGROUP BY
:Penjelasan:
Bergabung meja dengan dirinya sendiri menggunakan
rumah
kolom. PenggunaanLEFT JOIN
memastikan semua baris dari tabelm
muncul dalam hasil set. Orang-orang yang don't memiliki pertandingan di tabelb
akanNULL untuk kolom
b`.Kondisi lainnya pada
BERGABUNG
meminta untuk mencocokkan baris darib
yang memiliki nilai yang lebih besar padadatetime
kolom dari baris darim
.Menggunakan data-data yang diposting di pertanyaan,
LEFT JOIN
akan menghasilkan pasangan ini:Akhirnya,
WHERE
terus-satunya pasangan yang memilikiNULL dalam kolom
b(mereka ditandai dengan
*pada tabel di atas); ini berarti, karena kondisi kedua dari
BERGABUNGklausa, baris yang dipilih dari
mmemiliki nilai terbesar pada kolom
datetime`.Membaca SQL Antipatterns: Menghindari Perangkap Pemrograman Database buku yang lain tips SQL.
Ini akan bekerja bahkan jika anda memiliki dua atau lebih baris untuk masing-masing
rumah
sama denganDATETIME
's:Saya pikir ini akan memberi anda hasil yang diinginkan:
TAPI jika anda membutuhkan kolom lain juga, hanya membuat yang bergabung dengan meja asli (check
Michael La Voie
jawaban)Salam.
Sejak orang-orang tampaknya tetap berjalan ke thread ini (tanggal komentar berkisar 1,5 tahun) isn't ini jauh lebih sederhana:
SELECT * FROM (SELECT * FROM topten ORDER BY datetime DESC) tmp KELOMPOK DENGAN rumah
Tidak ada fungsi agregasi dibutuhkan...
Sorak-sorai.
Anda juga dapat mencoba yang satu ini dan untuk meja besar query kinerja akan menjadi lebih baik. Ia bekerja ketika ada lebih dari dua catatan untuk masing-masing rumah dan tanggal yang berbeda. Baik umum query MySQL adalah salah satu dari Michael La Voie di atas.
Atau dalam kasus Postgres atau mereka dbs yang memberikan analisis fungsi mencoba
Ini bekerja pada Oracle:
Coba ini untuk SQL Server:
Cara lain untuk gt terbaru-turut per kelompok menggunakan sub query yang pada dasarnya menghitung pangkat untuk setiap baris per kelompok dan kemudian menyaring terbaru anda baris seperti dengan rank = 1
DEMO
Berikut ini adalah demo visual untuk peringkat yang ada untuk setiap baris untuk pemahaman yang lebih baik
Pertanyaan di atas akan gagal dan akan kembali lebih dari 1 baris di atas situasi. Untuk menutupi situasi ini akan ada kebutuhan lain kriteria/parameter/kolom untuk menentukan baris mana yang harus diambil yang jatuh di atas situasi. Dengan melihat contoh data set saya berasumsi ada primary key kolom
id
yang harus di set ke auto increment. Jadi kita dapat menggunakan kolom ini untuk memilih yang paling baru-baru ini turut dengan mengutak-atik query yang sama dengan bantuan dariKASUS
pernyataan sepertiDEMO
Pertanyaan di atas akan memilih baris dengan tertinggi id antara sama
datetime
nilai-nilaivisual demo untuk peringkat yang ada untuk masing-masing baris
Berikut ini adalah MySQL versi yang mencetak hanya satu entri di mana ada duplikat MAX(datetime) dalam kelompok.
Anda bisa tes di sini http://www.sqlfiddle.com/#!2/0a4ae/1
Data Sampel
Versi MySQL dengan User variabel
Menerima Jawaban' outout
Mengapa tidak menggunakan: PILIH rumah, MAX(datetime) SEBAGAI MaxDateTime,pemain,sumber daya DARI topten KELOMPOK DENGAN rumah Apa aku melewatkan sesuatu?
Coba ini
Salam K
ini adalah query yang anda butuhkan:
@Mic jawaban Yang diterima akan bekerja dengan baik di sebagian besar kasus, tetapi gagal untuk satu untuk sebagai berikut.
Dalam kasus jika ada 2 baris yang memiliki HomeID dan Datetime yang sama dengan query akan mengembalikan baris kedua, tidak berbeda HomeID seperti yang diperlukan, untuk itu tambahkan Berbeda dalam query seperti di bawah ini.