Jak mogę wybrać wiersze z MAX (wartość kolumny), ODRÓŻNIĆ według innej kolumny w SQL?


767

Mój stół to:

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

Muszę wybrać każde odrębne homeposiadające maksymalną wartość datetime.

Wynik byłby:

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

Próbowałem:

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

Nie działa Zestaw wyników ma 130 wierszy, chociaż baza danych zawiera 187. Wynik zawiera kilka duplikatów 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 

Nie. Daje wszystkie rekordy.

-- 3 ..something exotic: 

Z różnymi wynikami.

Odpowiedzi:


938

Jesteś tak blisko! Wszystko, co musisz zrobić, to wybrać ZARÓWNO dom i jego maksymalną datę, a następnie dołączyć ponownie do toptentabeli ZARÓWNO:

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
Przetestuj to pod kątem wyraźności, jeśli dwie równe maks. Data i godzina będą w tym samym domu (z różnymi graczami)
Maksym Gontar

5
Myślę, że klasycznym sposobem na to jest naturalne dołączenie: „WYBIERZ tt. * OD topten tT NATURALNE DOŁĄCZ (WYBIERZ dom, MAX (datetime) AS datetime Z topten GROUP BY home) mostrecent;” To samo zapytanie dokładnie, ale zapewne bardziej czytelne
Parker

31
co jeśli dwa wiersze mają takie same wartości pola „home” i „datetime”?
Kemal Duran

3
@Młody problem z zapytaniem polega na tym, że może on zwrócić id, playera resourcedla wiersza innego niż maksymalny dla danego domu, tj. Dla domu = 10, możesz otrzymać: 3 | 10 | 04/03/2009 | john | 300 Innymi słowy, nie gwarantuje, że cała kolumna wiersza w zestawie wyników będzie należała do maks. (data / godzina) dla danego domu.
sactiw

1
@ Me1111 Problem z twoim zapytaniem polega na tym, że może / nie może zwrócić wiersz z maksimum (datetime) dla danego domu. Powodem, dla którego GROUP BY pobierze dowolny losowy wiersz dla każdego domu, a ORDER BY po prostu posortuje ogólny wynik uzyskany przez GROUP BY
sactiw

87

Najszybsze MySQLrozwiązanie, bez wewnętrznych zapytań i bez 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

Objaśnienie :

Połącz ze sobą tabelę za pomocą homekolumny. Zastosowanie LEFT JOINzapewnia, że ​​wszystkie wiersze z tabeli mpojawią się w zestawie wyników. Te, które nie mają dopasowania w tabeli, bbędą miały NULLs dla kolumn b.

Drugi warunek w JOINpytaniu o dopasowanie tylko wierszy z btego ma większą wartość w datetimekolumnie niż wiersz z m.

Korzystając z danych opublikowanych w pytaniu, LEFT JOINutworzą następujące pary:

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

Wreszcie WHEREklauzula zachowuje tylko pary, które mają NULLs w kolumnach b(są oznaczone symbolem *w powyższej tabeli); oznacza to, że z powodu drugiego warunku z JOINklauzuli wybrany wiersz mma największą wartość w kolumnie datetime.

Przeczytaj książkę Antypatterns SQL: unikanie pułapek związanych z programowaniem baz danych w celu uzyskania innych wskazówek SQL.


Z SQLitepierwszym jest znacznie wolniejszy niż wersja La Voie, gdy nie ma indeksu w dopasowanej kolumnie (tj. „Home”). (Testowane z 24 tys. Rzędów, co daje 13 tys. Rzędów)
Thomas Tempelmann

10
To najlepsza odpowiedź, jeśli pokażesz plan wykonania, zobaczysz o jeden krok mniej dzięki temu zapytaniu
TlmaK0

Co się stanie, jeśli 2 rzędy mają takie same homei datetimea datetimejest maksymalna dla tego konkretnego home?
Istiaque Ahmed

Oba wiersze pojawiają się w zestawie wyników. Ta odpowiedź jest dowodem koncepcji. W swoim prawdziwym kodzie prawdopodobnie masz inne kryterium wyboru tylko jednego z nich w tej sytuacji (być może pierwszego lub ostatniego albo do wyboru używasz innej kolumny). Po prostu dodaj to kryterium jako nowy warunek w ONklauzuli. Fe ... ON ... AND m.id < b.idutrzymać najnowszego wpisu (jednej z największych id), gdy dwa wiersze mają takie same wartości w homei datetimekolumny i to jest maksymalna datetime.
axiac

Jakie indeksy najlepiej zoptymalizować dla takiego zapytania?
AjaxLeung

73

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

EDYCJA
Niestety w MySQL nie ma funkcji RANK () OVER.
Ale można go emulować, patrz: Emulowanie funkcji analitycznych (ranking AKA) za pomocą MySQL .
To jest wersja 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

przepraszam stary, # 1064 - Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, aby uzyskać poprawną składnię do użycia w pobliżu '() OVER (PARTITION BY krd ORDER BY dzienny DESC) N OD @rapsa) M GDZIE N =' w linii 1
Kaptah

2
ah, więc używasz MySQL. Od tego powinieneś zacząć! Wkrótce zaktualizuję odpowiedź.
Maksym Gontar,

@MaxGontar, Twoje rozwiązanie MySQL skały, thx. co jeśli w swoim @_TestTable usuniesz wiersz nr 1>: WYBIERZ 1, 10, „2009-03-04”, „john”, 399, to jest, jeśli masz jeden wiersz dla danej wartości domu? dzięki.
egidiocs

2
BŁĄD: Zamień „RANK ()” na „ROW_NUMBER ()”. Jeśli masz remis (spowodowany zduplikowaną wartością daty), będziesz mieć dwa rekordy z „1” dla N.
MikeTeeVee

29

Działa to nawet, jeśli masz dwa lub więcej wierszy dla każdego homez równymi 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

dodano pole wieczka w tabeli, No Good
Kaptah

1
Ten nie zadziałał na PHPMyAdmin. Strona odświeża się, ale nie ma wyniku ani błędu ..?
Kaptah

WHERE ti.home = t1.home- czy możesz wyjaśnić składnię?
Istiaque Ahmed

@IstiaqueAhmed: czego dokładnie tu nie rozumiesz? Jest to zapytanie skorelowane, a wspomniane wyrażenie jest warunkiem korelacji.
Quassnoi,

@Quassnoi, selectKwerenda zawierająca wiersz WHERE ti.home = t1.home nie potrzebuje FROMzdefiniowanej klauzuli t1. Jak więc się go stosuje?
Istiaque Ahmed,

26

Myślę, że da to pożądany efekt:

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

ALE jeśli potrzebujesz również innych kolumn, po prostu połącz z oryginalną tabelą (sprawdź Michael La Voieodpowiedź)

Z poważaniem.


8
Potrzebuje także innych kolumn.
Quassnoi

4
id, dom,
data

17

Ponieważ ludzie wydają się ciągle napotykać ten wątek (data komentarza wynosi od 1,5 roku), nie jest to o wiele prostsze:

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

Żadne funkcje agregujące nie są potrzebne ...

Twoje zdrowie.


6
To nie działa. Komunikat o błędzie: Kolumna „x” jest niepoprawna na liście wyboru, ponieważ nie jest zawarta ani w funkcji agregującej, ani w klauzuli GROUP BY.
Ptactwo

To na pewno nie zadziała w SQL Server lub Oracle, choć wygląda na to, że może działać w MySQL.
ErikE

To jest naprawdę piękne! Jak to działa? Korzystając z DESC i domyślnej kolumny powrotu grupy? Więc jeśli zmienię go na ASC datetime, zwróci najwcześniejszy wiersz dla każdego domu?
przyszłość,

To jest genialne!
Dog Lover

To proste nie działa, jeśli masz niezagregowane kolumny (w MySQL).
user3562927 17.04.17

11

Możesz także wypróbować ten, a w przypadku dużych tabel wydajność zapytań będzie lepsza. Działa, gdy nie ma więcej niż dwóch zapisów dla każdego domu, a ich daty są różne. Lepsze ogólne zapytanie MySQL pochodzi od powyższego Michaela La Voie.

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

Lub spróbuj Postgres lub dbs, które zapewniają funkcje analityczne

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

Czy ta odpowiedź jest poprawna? Próbowałem go użyć, ale wydaje się, że nie wybiera rekordu z najnowszą datą dla „domu”, ale usuwa rekord z najstarszą datą. Oto przykład: SQLfiddle
marcin93w

1
@kidOfDeath - Zaktualizowałem moją odpowiedź kontekstem i zapytaniem Postgres
Shiva

Z SQLitepierwszym jest znacznie wolniejszy niż wersja La Voie, gdy nie ma indeksu w dopasowanej kolumnie (tj. „Home”).
Thomas Tempelmann

8

Działa to na 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

1
jak to wybiera maksymalny czas do daty? poprosił o pogrupowanie według domu i wybranie maks. daty i godziny. Nie rozumiem, jak to się dzieje.
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

Wypróbuj to dla 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

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

Oto wersja MySQL, która drukuje tylko jeden wpis, w którym są duplikaty MAX (datetime) w grupie.

Możesz przetestować tutaj http://www.sqlfiddle.com/#!2/0a4ae/1

Przykładowe dane

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

Wersja MySQL ze zmienną użytkownika

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

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)

Chociaż uwielbiam tę odpowiedź, ponieważ bardzo mi to pomaga, muszę wskazać jedną poważną wadę, która zależy od używanego systemu mysql. Zasadniczo to rozwiązanie opiera się na klauzuli ORDER BY w podselekcji. To może lub NIE MOŻE działać w różnych środowiskach mysql. Nie próbowałem tego na czystym MySQL, ale na pewno nie działa NIEZAWODNIE na MariaDB 10.1, jak wyjaśniono tutaj stackoverflow.com/questions/26372511/... ale ten sam kod działa poprawnie na serwerze Percona . Mówiąc ściślej, MOŻESZ lub NIE MOŻESZ uzyskać takich samych wyników, w zależności od liczby kolumn t1.
Radek,

Przykładem tego stwierdzenia jest to, że na MariaDB 10.1 działało, gdy użyłem 5 kolumn z tabeli t1. Gdy tylko dodałem szóstą kolumnę, najwyraźniej bałagając się „naturalnym” sortowaniem danych w oryginalnej tabeli, przestała działać. Powodem jest to, że dane w podselekcji stały się nieporządkowane i dlatego spełniłem warunek „is_first_appear = 1” kilka razy. Ten sam kod, z tymi samymi danymi, działał na Perconie ok.
Radek,

5

Innym sposobem na gt najnowszy wiersz na grupę za pomocą zapytania podrzędnego, które zasadniczo oblicza pozycję dla każdego wiersza na grupę, a następnie odfiltrowuje ostatnie wiersze, jak w przypadku rankingu = 1

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

PRÓBNY

Oto wizualne demo rangi nr dla każdego rzędu dla lepszego zrozumienia

Czytając kilka komentarzy, a jeśli są dwa wiersze, które mają takie same wartości pola „home” i „datetime”?

Powyższe zapytanie zakończy się niepowodzeniem i zwróci więcej niż 1 wiersz dla powyższej sytuacji. Aby zatuszować tę sytuację, potrzebne będą inne kryteria / parametry / kolumny, aby zdecydować, który wiersz należy wziąć, który przypada w powyższej sytuacji. Przeglądając przykładowy zestaw danych, zakładam, że istnieje kolumna klucza podstawowego, idktórą należy ustawić na automatyczne zwiększenie. Możemy więc użyć tej kolumny, aby wybrać najnowszy wiersz, dostosowując to samo zapytanie za pomocą CASEinstrukcji typu

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

PRÓBNY

Powyższe zapytanie spowoduje wybranie wiersza o najwyższym identyfikatorze spośród tych samych datetimewartości

demo wizualne rangi nr dla każdego rzędu


2

Dlaczego nie użyć: WYBIERZ dom, MAX (data / godzina) AS MaxDateTime, odtwarzacz, zasób Z topten GROUP BY home Czy coś przeoczyłem?


4
Dotyczyłoby to tylko MySQL i tylko wersji wcześniejszych niż 5.7 (?) Lub późniejszych niż 5.7 z wyłączonym ONLY_FULL_GROUP_BY, ponieważ to WYBIERANIE kolumn, które nie zostały zagregowane / pogrupowane (odtwarzacz, zasoby), co oznacza, że ​​MySQL dostarczy losowo wybrane wartości dla tych dwa pola wyników. Kolumna odtwarzacza nie stanowiłaby problemu, ponieważ koreluje z kolumną główną, ale kolumna zasobów nie koreluje z kolumną główną ani z datą i nie można zagwarantować, jaką wartość zasobu otrzymasz.
simpleuser,

+1 za objaśnienie, ALE w odpowiedzi na zadane pytanie to zapytanie nie zwróci expectedwyniku w MySQL w wersji 5.6 i beforebardzo wątpię, aby zachowało się inaczej w MySQL w wersji 5.7 i after.
sactiw

@simpleuser, `Nie byłoby problemu z kolumną odtwarzacza, ponieważ koreluje z kolumną główną` - czy możesz wyjaśnić więcej?
Istiaque Ahmed,

@IstiaqueAhmed, kiedy patrzę na to ponownie, stwierdzenie to jest niepoprawne. Myślałem, że każdy gracz ma zawsze tę samą wartość domu, ale teraz widzę, że nie, więc ten sam losowy problem pojawi się również w tej kolumnie
simpleuser

1

Spróbuj tego

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

Pozdrawiam K.


5
Przetestuj to pod kątem wyraźności, jeśli dwie równe maks. Data i godzina będą w tym samym domu (z różnymi graczami)
Maksym Gontar

alias na max(datetime) to datetime. Czy to nie będzie stanowiło problemu?
Istiaque Ahmed,

Jak datetimewybierany jest najwyższy ?
Istiaque Ahmed,

1

oto zapytanie, którego potrzebujesz:

 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;

czy możesz wyjaśnić swoją odpowiedź?
Istiaque Ahmed,

1

@Michae Przyjęta odpowiedź będzie działać dobrze w większości przypadków, ale nie powiedzie się dla jednego z poniższych.

W przypadku, gdy były dwa wiersze o Identyfikatorze domowym i Datetime takie same, zapytanie zwróci oba wiersze, a nie odrębny Identyfikator domowy zgodnie z wymaganiami, dla dodania Wyraźny w zapytaniu, jak poniżej.

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

wyniki pokazują - „# 1054 - Nieznana kolumna„ tt.MaxDateTime ”na„ liście pól ””
Istiaque Ahmed,

@IstiaqueAhmed, czy masz już MaxDatetime, tj. Jakakolwiek nazwa kolumny tego typu ..?
Manoj Kargeti

Nie, tabela w OP nie ma takiej kolumny.
Istiaque Ahmed,

błąd mówi również to samo proszę ... co dokładnie chcesz zrobić? czy możesz wysłać strukturę tabeli i zapytanie?
Manoj Kargeti

1

Nadzieja poniżej zapytania da pożądany wynik:

Select id, home,datetime,player,resource, row_number() over (Partition by home ORDER by datetime desc) as rownum from tablename where rownum=1
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.