SQL'de başka bir sütuna göre MAX (Sütun değeri), DISTINCT satırlarını nasıl SEÇEBİLİRİM?


768

Masam:

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

homeMaksimum değerini tutan her farklı seçmeliyim datetime.

Sonuç:

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

Denedim:

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

Çalışmıyor. Sonuç kümesinde veritabanı 187 olsa da 130 satır vardır. Sonuç, bazı kopyalarını içerir 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 

Hayır! Tüm kayıtları verir.

-- 3 ..something exotic: 

Çeşitli sonuçlarla.

Yanıtlar:


939

Çok yakınsın! Yapmanız gereken tek şey hem İKİ 'yi hem de maksimum tarih saatini seçmek, sonra toptenİKİ alanlardaki tabloya tekrar katılmaktır :

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

5
İki eşit maksimum datetime aynı evde ise (farklı oyuncularla) farklı olup olmadığını test edin
Maksym Gontar

5
Bunu yapmanın klasik yolunun doğal bir birleşim olduğunu düşünüyorum: "SELECT tt. * FOTOĞRAF topten tt DOĞAL BİRLEŞTİRME Tam olarak aynı sorgu, ancak tartışmasız daha okunabilir
Parker

31
aynı 'home' ve 'datetime' alan değerlerine sahip iki satır varsa ne olur?
Kemal Duran

3
@Young talebinizle ilgili sorun döndürebilir ki id, playerve resourcesen alabilirsiniz = 10 ev için verilen bir ev ie için olmayan maksimum satır: 3 | 10 | 04/03/2009 | john | 300 Bir başka deyişle bu resultset'de bir satırın tüm sütun ait olacak garanti etmez verilen ev için maksimuma (datetime) kadar.
sactiw

1
@ me1111 sorgunuzla ilgili sorun, belirli bir ev için satır ith max (datetime) döndürüp döndüremeyebileceğidir. GROUP BY olmasının nedeni, her ev için herhangi bir rastgele satır getirecek ve ORDER BY, GROUP BY tarafından üretilen tüm sonucu sıralayacaktır
sactiw

87

MySQLİç sorgular olmadan ve olmadan en hızlı çözüm 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

Açıklama :

homeSütunu kullanarak tabloya kendiniz katılın . Şunun kullanımı, LEFT JOINtablodaki tüm satırların msonuç kümesinde görünmesini sağlar . Tabloda eşleşmesi olmayanların sütunları için s bolacaktır .NULLb

İsteklerdeki diğer koşul, JOINyalnızca sütun üzerinde satırdan bdaha büyük bir değere sahip satırları eşleştirmeyi ister .datetimem

Soruda yayınlanan verileri kullanarak, LEFT JOINbu çiftler üretilecektir:

+------------------------------------------+--------------------------------+
|              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       | ... | *
+------------------------------------------+--------------------------------+

Son olarak, WHEREmadde yalnızca NULLsütunlarında s olan çiftleri tutar b( *yukarıdaki tabloda ile işaretlenmiştir ); bu, cümledeki ikinci koşul nedeniyle JOIN, seçilen satırın msütundaki en büyük değere sahip olduğu anlamına gelirdatetime .

Diğer SQL ipuçları için SQL Antipatterns: Veritabanı Programlamasının Tuzaklarından Kaçınma kitabını okuyun .


İle SQLiteeşleşti sütuna (yani "ev") üzerinde hiçbir indeks varken, ilki çok daha yavaş La Voie versiyonu aşıyor. (
bin

10
Bu en iyi cevaptır, yürütme planını gösterirseniz bu sorgu ile bir adım daha az görürsünüz
TlmaK0

2 satır aynı olup olmadığını ne olacak homeve datetimeve datetimeo belirli için maksimum home?
Istiaque Ahmed

Her iki satır sonuç kümesinde görünür. Bu cevap bir kavram kanıtıdır. Gerçek kodunuzda muhtemelen bu durumda bunlardan sadece birini seçmek için başka bir kriteriniz var (belki ilk veya sonuncusu veya karar vermek için başka bir sütun kullanırsınız). Sadece bu kriteri ONmaddede yeni bir koşul olarak ekleyin . İki satır ve sütunlarda aynı değerlere ve en yüksek değere sahip olduğunda ... ON ... AND m.id < b.iden son girişi (en büyük olanı id) tutmak için Fe . homedatetimedatetime
axiac

Böyle bir sorgu için hangi dizinler en iyi şekilde optimize edilir?
AjaxLeung

73

İşte T-SQL sürümü:

-- 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
Ne yazık ki, MySQL RANK () OVER işlevi yoktur.
Ancak benzetilebilir, bkz . MySQL ile Analitik (AKA Sıralaması) İşlevleri .
Yani bu MySQL sürümü:

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

üzgünüm ahbap, # 1064 - SQL sözdiziminde bir hata var; '() OVER (krd ORDER BY gündüz DESC) N FROM @rapsa) M NEREDE N =' yakınında 1'de kullanmak için doğru sözdizimine ilişkin MySQL sunucu sürümünüze karşılık gelen kılavuzu kontrol edin
Kaptah

2
ah, yani MySQL kullanıyorsunuz. Başlamanız gereken şey bu! Cevabı yakında güncelleyeceğim.
Maksym Gontar

@ MaxGontar, MySQL çözümünüz sallıyor, teşekkürler. @_TestTable'ınızda # 1 numaralı satırı kaldırırsanız: SEÇ 1, 10, '2009-03-04', 'john', 399, bu, belirli bir ev değeri için tek bir satırınız varsa ne olur? Teşekkür.
egidiocs

2
Hata: "RANK ()", "ROW_NUMBER ()" ile değiştirin.
Beraberiniz

29

Bu, her birine homeeşit iki satır içeren iki veya daha fazla satırınız olsa bile çalışır 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

masaya kapak alanı eklendi, İyi Değil
Kaptah

1
Bu PHPMyAdmin üzerinde yürütülmedi. Sayfa yenileniyor ancak sonuç veya hata yok ..?
Kaptah

WHERE ti.home = t1.home- sözdizimini açıklayabilir misiniz?
Istiaque Ahmed

@IstiaqueAhmed: burada tam olarak anlamadığınız şey nedir? Bu ilişkili bir sorgu ve bahsettiğiniz ifade bir korelasyon koşuludur.
Quassnoi

@Quassnoi, Satırı olan selectsorgu , tanımlayan maddeye WHERE ti.home = t1.home ihtiyaç duymaz . Peki nasıl kullanılır? FROMt1
Istiaque Ahmed

26

Bunun size istenen sonucu vereceğini düşünüyorum:

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

AMA başka sütunlara da ihtiyacınız varsa, orijinal tabloyla birleştirme yapın ( Michael La Voieyanıtı kontrol edin )

Saygılarımla.


8
Başka sütunlara da ihtiyacı var.
Quassnoi

4
id, ana sayfa, datetime, oyuncu, kaynak
Quassnoi

17

İnsanlar bu konuya girmeye devam ettikleri için (yorum tarihi 1,5 yıl arasında değişiyor) bu kadar basit değil:

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

Toplama işlevi gerektirmez ...

Şerefe.


6
Bu işe yaramıyor gibi görünüyor. Hata İletisi: 'x' sütunu, toplama işlevinde veya GROUP BY deyiminde bulunmadığından seçim listesinde geçersiz.
Fowl

Bu kesinlikle SQL Server veya Oracle'da çalışmaz, ancak MySQL'de çalışabilir gibi görünüyor.
ErikE

Bu gerçekten çok güzel! Bu nasıl çalışıyor? DESC ve varsayılan grup dönüş sütununu kullanarak? Öyleyse bunu datetime ASC olarak değiştirirsem, her ev için en eski satırı döndürür mü?
wayofthefuture

Bu harika!
Dog Lover

Toplanmamış sütunlarınız varsa (MySQL'de) bu düzleştirme çalışmaz.
user3562927

11

Bunu da deneyebilirsiniz ve büyük tablolar için sorgu performansı daha iyi olacaktır. Her ev için ikiden fazla kayıt olmadığında ve tarihleri ​​farklı olduğunda çalışır. Daha iyi genel MySQL sorgusu yukarıdaki Michael La Voie'den biridir.

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

Ya da Postgres veya analitik fonksiyonlar sağlayan dbs

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

Bu cevap doğru mu? Kullanmaya çalıştım, ancak 'ev' için en yeni tarihe sahip kaydı seçmemek için dikiş yapıyor, ancak yalnızca en eski tarihe sahip kaydı kaldırıyor. İşte bir örnek: SQLfiddle
marcin93w

1
@kidOfDeath - Bağlam ve Postgres sorgusu ile cevabım güncellendi
Shiva

İle SQLiteeşleşti sütuna (yani "ev") üzerinde hiçbir indeks varken, ilki çok daha yavaş La Voie versiyonu aşıyor.
Thomas Tempelmann

8

Bu Oracle üzerinde çalışır:

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

1
bu maksimum datetime'ı nasıl seçer? diye sordu evlerine göre gruplandırmayı ve max datetime'ı seç. Bunun nasıl yaptığını anlamıyorum.
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

8

SQL Server için şunu deneyin:

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

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)

5

İşte bir grupta MAX (datetime) kopyası olan yalnızca bir girdi yazdıran MySQL sürümü.

Burada test edebilirsiniz http://www.sqlfiddle.com/#!2/0a4ae/1

Örnek veri

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

Kullanıcı değişkenli MySQL Sürümü

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)

Kabul Edilen Yanıtların kesilmesi

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)

Bu yanıtı çok seviyorum, çünkü bu bana çok yardımcı oluyor, kullanılan mysql sistemine güvenen bir büyük kusura işaret etmek zorundayım. Temel olarak, bu çözüm alt seçimdeki ORDER BY yantümcesine dayanır. Bu MIGHT veya çeşitli Mysql ortamlarında ÇALIŞMAZ. Burada açıklandığı ben saf MySQL üzerinde hiç denemedim, ama herhalde bu mariadb 10.1 üzerinde GÜVENİLİR çalışmıyor stackoverflow.com/questions/26372511/... ama çok aynı kod Percona Server çalışma sonucu olumlu mu. Kesin olmak gerekirse, t1 sütununun miktarına bağlı olarak aynı sonuçları alabilir ve MIGHT OLABİLİRSİNİZ.
Radek

Bu ifadeye örnek olarak, t1 tablosundan 5 sütun kullandığımda MariaDB 10.1'de işe yaradı. Altıncı sütunu eklediğimde, orijinal tablodaki "doğal" veri sıralama ile uğraştığında, çalışmayı durdurdu. Nedeni, alt seçimdeki veri sıra dışı hale geldi ve böylece birkaç kez "is_first_appear = 1" koşulu vardı. Aynı kod, aynı verilerle, Percona ok üzerinde çalıştı.
Radek

5

Temel olarak grup başına her bir satır için bir sıra hesaplayan ve ardından en son satırlarınızı rank = 1 ile filtreleyen bir alt sorgu kullanarak grup başına en son satırı gt yapmanın başka bir yolu

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

DEMO

İşte daha iyi anlamak için her sıra için rütbe no görsel demo

Bazı yorumları okuyarak aynı 'home' ve 'datetime' alan değerlerine sahip iki satır varsa ne olur?

Yukarıdaki sorgu başarısız olur ve yukarıdaki durum için 1'den fazla satır döndürür. Bu durumu kapatmak için, yukarıdaki duruma hangi sıranın alınması gerektiğine karar vermek için başka bir kriter / parametre / sütuna ihtiyaç olacaktır. Örnek veri setini görüntüleyerek id, otomatik artırmaya ayarlanması gereken bir birincil anahtar sütunu olduğunu varsayıyorum . Biz yardımıyla aynı sorguyu verdiği en son satır almak için bu sütunu kullanabilirsiniz Yani CASEaçıklamada gibi

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

Yukarıdaki sorgu, aynı datetimedeğerler arasında en yüksek kimliğe sahip satırı seçer

her sıra için rütbe no görsel demo


2

Neden kullanmıyorsunuz: SELECT home, MAX (datetime) AS MaxDateTime, player, kaynak topten GROUP by home Bir şey mi kaçırdım?


4
Bu yalnızca MySQL ile ve yalnızca 5.7 (?) Öncesi veya ONLY_FULL_GROUP_BY devre dışı bırakılmış 5.7'den sonraki sürümler için geçerli olacaktır, çünkü MySQL bunlar için rastgele seçilen değerleri sağlayacak anlamına gelen SELECTing sütunlarıdır. iki sonuç alanı. Oynatıcı sütunu için sorun olmaz, çünkü bu ana sütunla ilişkilidir, ancak kaynak sütunu ana sayfa veya datetime sütunu ile ilişkili olmaz ve hangi kaynak değerini alacağınızı garanti edemezsiniz.
simpleuser

Açıklama için +1, ANCAK sorulan soru bu sorgunun expectedMySQL sürüm 5.6 çıktı döndürmez sorulan wrt ve beforeve ben çok MySQL sürüm 5.7 ve başka şekilde davranacağından şüphe after.
sactiw

@simpleuser, `Bu oyuncu kolonunda sorun olmaz çünkü bu ana sütun ile ilişkilidir`` daha fazla açıklayabilir misiniz?
Istiaque Ahmed

@IstiaqueAhmed tekrar baktığımda, bu ifade yanlış. Her oyuncunun her zaman aynı ev değerine sahip olduğunu düşünmüştüm, ama şimdi
görmediler

1

Bunu dene

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

Saygılarımızla K


5
İki eşit maksimum datetime aynı evde ise (farklı oyuncularla) farklı olup olmadığını test edin
Maksym Gontar

için takma max(datetime) DİR datetime. Herhangi bir sorun yaratmaz mı?
Istiaque Ahmed

En yüksek nasıl datetimeseçilir?
Istiaque Ahmed

1

bu, ihtiyacınız olan sorgudur:

 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;

cevabını açıklayabilir misin
Istiaque Ahmed

1

@Michae Kabul edilen cevap çoğu durumda iyi çalışacaktır, ancak bir tanesi için aşağıdaki gibi başarısız olur.

HomeID ve Datetime değerlerine sahip 2 satır olması durumunda, sorgu her iki satırı döndürür, gerektiği şekilde farklı HomeID değerini döndürür;

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

sonuç gösteriyor - "# 1054 - 'alan listesinde' bilinmeyen sütun 'tt.MaxDateTime'"
Istiaque Ahmed

@IstiaqueAhmed MaxDatetime dosyaladınız mı yani böyle bir sütun adı ..?
Manoj Kargeti

Hayır, OP'deki tablonun böyle bir sütunu yoktur.
Istiaque Ahmed

hata da aynı söyleyerek lütfen .. tam olarak ne yapmak istiyorsun? u tablo yapısı ve sorgu gönderebilirsiniz.
Manoj Kargeti

1

Sorgunun altındaki umut istenen çıktıyı verecektir:

Select id, home,datetime,player,resource, row_number() over (Partition by home ORDER by datetime desc) as rownum from tablename where rownum=1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.