SQL의 다른 열에 의해 MAX (열 값), DISTINCT를 사용하여 행을 어떻게 선택할 수 있습니까?


768

내 테이블은 :

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

작동하지 않습니다. 데이터베이스에 187 개가 있지만 결과 집합에 130 개의 행이 있습니다. 결과에의 일부 중복이 포함됩니다 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: 

다양한 결과로.

답변:


938

당신은 너무 가깝습니다! 집과 최대 날짜 시간 topten을 모두 선택한 다음 BOTH 필드 의 테이블에 다시 가입하기 만하면됩니다.

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
두 명의 동일한 최대 날짜 시간이 동일한 집에 있다면 (다른 플레이어와 함께)
Maksym Gontar

5
이 작업을 수행하는 고전적인 방법은 자연스러운 조인입니다. "SELECT tt. * FROM topten tt NATURAL JOIN (SELECT home, MAX (datetime) AS datetime FROM topten GROUP BY home)"; 정확히 같은 쿼리이지만, 더 읽기 쉽다
Parker

31
'home'및 'datetime'필드 값이 동일한 두 개의 행이있는 경우는 어떻습니까?
Kemal Duran 2016 년

3
@Young 쿼리의 문제는 반환 할 수 있다는 것입니다 id, player그리고 resource당신이 얻을 수 = 10 가정을위한 주어진 가정, 즉 비 최대 행의 : 3 | 10 | 04/03/2009 | john | 300 즉이 결과 집합의 행의 모든 열이 속한 것이라는 점을 보장하지 않습니다 주어진 집에 대한 최대 (날짜 시간).
sactiw

1
귀하의 쿼리에 @ me1111 문제는 주어진 가정에 대해 행 ith max (datetime)을 반환하지 않을 수도 있다는 것입니다. GROUP BY되는 이유는 각 가정을위한 어떤 임의의 행을 가져옵니다 및 ORDER BY는 GROUP BY에 의해 그저 전반적인 모든 결과 생산하므로
sactiw

87

MySQL내부 쿼리가없고없는 가장 빠른 솔루션 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

설명 :

home열을 사용하여 테이블 자체를 조인하십시오 . 를 사용 LEFT JOIN하면 테이블의 모든 행 m이 결과 집합에 나타납니다. 테이블에서 일치하지 않는 항목은 의 열에 대해을 b갖습니다 .NULLb

의 다른 조건은의 JOIN행 보다 열의 b값이 큰 행만 일치하도록 요청합니다 .datetimem

질문에 게시 된 데이터를 사용하면 다음과 LEFT JOIN같은 쌍이 생성됩니다.

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

마지막 WHERE으로이 절 NULL은 열에 s 가있는 쌍만 유지합니다 b( *위의 표에 표시되어 있음 ). 이는 JOIN절의 두 번째 조건으로 인해에서 선택된 행 m이 column에서 가장 큰 값을 갖음을 의미 datetime합니다.

다른 SQL 팁에 대해서는 SQL 안티 패턴 : 데이터베이스 프로그래밍의 함정 피하기 책을 읽으십시오 .


을 사용 SQLite하면 첫 번째 항목은 일치하는 열에 색인이없는 경우 (예 : "home") La Voie의 버전보다 훨씬 느립니다. (24k 행으로 테스트 한 결과 13k 행)
Thomas Tempelmann 10

10
이것이 가장 좋은 답입니다. 실행 계획을 보여 주면이 쿼리를 통해 한 걸음 더 적게 볼 수 있습니다
TlmaK0

2 개 행이 동일한이있는 경우 어떤 일이 일어날 것 home하고 datetime그리고는 datetime특정의 최대이다 home?
Istiaque Ahmed

두 행 모두 결과 집합에 나타납니다. 이 답변은 개념 증명입니다. 실제 코드에는 아마도이 상황에서 그중 하나만 선택하는 또 다른 기준이있을 것입니다 (첫 번째 또는 마지막 것 또는 다른 열을 사용하여 결정). 이 기준을 ON절의 새로운 조건으로 추가하십시오 . Fe ... ON ... AND m.id < b.idid두 개의 행이 같은 값 homedatetime열을 가질 때 가장 최근 항목 (가장 큰 항목)을 유지합니다 datetime.
axiac

이와 같은 쿼리에 가장 적합한 인덱스는 무엇입니까?
AjaxLeung

73

다음은 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

편집
불행히도 MySQL에는 RANK () OVER 함수가 없습니다.
그러나 에뮬레이션 할 수 있습니다 (MySQL로 분석 (AKA 순위) 함수 에뮬레이션 참조 ) .
따라서 이것은 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

죄송합니다, # 1064-SQL 구문에 오류가 있습니다. 1 행에 올바른 구문 MySQL 서버 버전에 해당하는 가까이 사용하는 설명서를 확인 '@rapsa FROM (낮 DESC에 의해 KRD 주문 파티션) () OVER를 N)을 M N ='
Kaptah

2
아, 그래서 당신은 MySQL을 사용하고 있습니다. 그것이 당신이 시작해야 할 것입니다! 곧 답변을 업데이트하겠습니다.
Maksym Gontar

@MaxGontar, mysql 솔루션은 thx입니다. _TestTable에서 row # 1>을 제거하는 경우 : SELECT 1, 10, '2009-03-04', 'john', 399 고마워.
egidiocs

2
BUG : "RANK ()"를 "ROW_NUMBER ()"로 바꿉니다. 동점 인 경우 (중복 날짜 값으로 인해) N에 대해 "1"인 두 개의 레코드가 있습니다.
MikeTeeVee

29

이것은 당신이 각각 두 개 이상의 행이있을 경우에도 작동합니다 home동일한와 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

테이블에 뚜껑을 추가 함,
좋지

1
이것은 PHPMyAdmin에서 실행되지 않았습니다. 페이지가 새로 고쳐 지지만 결과 나 오류가 없습니다 ..?
Kaptah

WHERE ti.home = t1.home-구문을 설명 할 수 있습니까?
Istiaque Ahmed

@ IstiaqueAhmed : 당신이 여기서 이해하지 못하는 것이 정확히 무엇입니까? 상관 된 쿼리이며 언급 한 표현식은 상관 조건입니다.
Quassnoi

@Quassnoi, select줄이있는 쿼리에는 을 정의 WHERE ti.home = t1.home 하는 FROM절이 필요하지 않습니다 t1. 그래서 어떻게 사용됩니까?
Istiaque Ahmed

26

나는 이것이 당신에게 원하는 결과를 줄 것이라고 생각합니다 :

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

그러나 다른 열도 필요하면 원래 테이블과 조인하십시오 ( Michael La Voie답변 확인 ).

친애하는.


8
그는 다른 칼럼도 필요합니다.
Quassnoi

4
id, 집, 날짜 시간, 플레이어, 리소스
Quassnoi

17

사람들 이이 스레드를 계속 실행하는 것처럼 보이기 때문에 (댓글 날짜 범위는 1.5 년입니다) 그리 간단하지 않습니다.

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

집계 함수가 필요하지 않습니다 ...

건배.


6
작동하지 않는 것 같습니다. 오류 메시지 : 'x'열이 집계 함수 또는 GROUP BY 절에 포함되어 있지 않으므로 선택 목록에서 유효하지 않습니다.
Fowl

이것은 SQL Server 또는 Oracle에서는 작동하지 않지만 MySQL에서는 작동하는 것처럼 보입니다.
ErikE

이것은 정말 아름답습니다! 어떻게 작동합니까? DESC와 기본 그룹 리턴 열을 사용합니까? datetime ASC로 변경하면 각 가정의 가장 빠른 행을 반환합니까?
wayofthefuture

훌륭합니다!
개 연인

이 요약은 MySQL에서 집계되지 않은 열이있는 경우 작동하지 않습니다.
user3562927

11

이것을 시도해 볼 수 있으며 큰 테이블의 경우 쿼리 성능이 향상됩니다. 각 가정에 대해 두 개 이상의 레코드가없고 날짜가 다른 경우 작동합니다. 더 나은 일반적인 MySQL 쿼리는 위의 Michael 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

또는 Postgres 또는 분석 기능을 제공하는 DB의 경우

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

이 답변이 맞습니까? 나는 그것을 사용하려고했지만 'home'에 대해 가장 새로운 날짜를 가진 레코드를 선택하지 않고 가장 오래된 날짜를 가진 레코드 만 제거합니다. 예를 들면 다음과 같습니다. SQLfiddle
marcin93w

1
@kidOfDeath-컨텍스트 및 Postgres 쿼리로 응답을 업데이트했습니다.
Shiva

을 사용 SQLite하면 첫 번째 항목은 일치하는 열에 색인이없는 경우 (예 : "home") La Voie의 버전보다 훨씬 느립니다.
Thomas Tempelmann

8

이것은 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
이것이 최대 날짜 시간을 어떻게 선택합니까? 그는 집별로 그룹화하고 최대 날짜 시간을 선택하도록 요청했습니다. 나는 이것이 어떻게하는지 알지 못한다.
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에서 이것을 시도하십시오.

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

다음은 그룹에 MAX (datetime)가 중복되는 항목을 하나만 인쇄하는 MySQL 버전입니다.

http://www.sqlfiddle.com/#!2/0a4ae/1에서 테스트 할 수 있습니다 .

샘플 데이터

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

사용자 변수가있는 MySQL 버전

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)

수락 된 답변

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)

Altho 나는이 답변을 매우 좋아합니다. 기본적으로이 솔루션은 subselect의 ORDER BY 절에 의존합니다. 이것은 여러 mysql 환경에서 작동하지 않을 수도 있습니다. 로 여기에서 설명, 나는 순수한 MySQL을 그것을 시도하지 않은,하지만 확실히이 MariaDB 10.1에서 안정적으로 작동하지 않습니다 stackoverflow.com/questions/26372511/... 하지만 매우 동일한 코드가 Percona 서버에서 작업 확인을 수행합니다. 정확하게 말하면 t1 열의 양에 따라 동일한 결과를 얻지 못할 수도 있습니다.
Radek

이 문장의 예는 MariaDB 10.1에서 t1 테이블의 5 열을 사용할 때 작동한다는 것입니다. 여섯 번째 열을 추가하자마자 원래 테이블의 "자연"데이터 정렬을 망쳐 놓으면 작동이 중지되었습니다. 그 이유는 subselect의 데이터가 정렬되지 않아서 "is_first_appear = 1"조건이 여러 번 충족 되었기 때문입니다. 동일한 데이터를 가진 동일한 코드가 Percona ok에서 작동했습니다.
Radek

5

기본적으로 그룹당 각 행의 순위를 계산 한 다음 순위 = 1과 같이 가장 최근의 행을 필터링하는 하위 쿼리를 사용하여 그룹당 가장 최근의 행을 나타내는 다른 방법

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

데모

다음은 이해를 돕기 위해 각 행의 순위 no에 대한 시각적 데모 입니다.

몇 가지 의견을 읽음으로써 'home'과 'datetime'필드 값이 같은 두 개의 행이 있다면 어떨까요?

위의 쿼리는 실패하고 위의 상황에 대해 둘 이상의 행을 반환합니다. 이 상황을 해결하기 위해서는 어떤 상황에서 어느 행을 취해야하는지 결정하기 위해 다른 기준 / 매개 변수 / 열이 필요합니다. 샘플 데이터 세트를 보면 id자동 증가로 설정해야하는 기본 키 열이 있다고 가정 합니다. 따라서이 열을 사용하여 다음 CASE과 같은 명령문을 사용하여 동일한 쿼리를 조정하여 가장 최근 행을 선택할 수 있습니다

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

데모

위의 쿼리는 동일한 datetime값 중에서 가장 높은 ID를 가진 행을 선택 합니다.

각 행의 순위 no에 대한 시각적 데모


2

사용하지 않는 이유 : SELECT home, MAX (datetime) AS MaxDateTime, player, resource FROM topten GROUP BY home 내가 놓친 부분이 있습니까?


4
MySQL에서만 유효하며 ONLY_FULL_GROUP_BY가 비활성화 된 5.7 이전 (5.7) 이후 또는 5.7 이후 버전에서만 유효합니다. 집계 / 그룹화되지 않은 SELECTing 열 (플레이어, 리소스)로 인해 MySQL은 임의로 선택된 값을 제공합니다. 두 개의 결과 필드. 플레이어 열은 홈 열과 관련이 있기 때문에 문제가되지 않지만 리소스 열은 홈 또는 날짜 / 시간 열과 관련이 없으며 어떤 리소스 값을 받을지 보장 할 수 없습니다.
simpleuser

설명을 위해 +1, 그러나이 질문 expected은 MySQL 버전 5.6에서 출력을 반환하지 않으며 beforeMySQL 버전 5.7 및에서 다르게 동작하는 것을 의심합니다 after.
sactiw

@simpleuser,`홈 컬럼과 관련되어 있기 때문에 플레이어 컬럼에는 문제가되지 않습니다. '-더 설명 할 수 있습니까?
Istiaque Ahmed

@IstiaqueAhmed 다시 한번 살펴보면, 그 진술은 틀 렸습니다. 나는 각 플레이어는 항상 같은 집 값을 가지고 생각했다,하지만 같은 임의의 선택 문제가 아니라 그 열의 발생, 그래서 나는 그들이하지 않는 것이 지금은 볼
simpleuser

1

이 시도

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

K에 감사합니다


5
두 명의 동일한 최대 날짜 시간이 동일한 집에 있다면 (다른 플레이어와 함께)
Maksym Gontar

에 대한 별칭은 max(datetime) 입니다 datetime. 문제가되지 않습니까?
Istiaque Ahmed

최고가 어떻게 datetime선택됩니까?
Istiaque Ahmed

1

이것은 당신이 필요로하는 쿼리입니다 :

 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;

답을 설명해 주시겠습니까?
Istiaque Ahmed

1

@Michae 허용되는 답변은 대부분의 경우에 효과가 있지만 다음과 같이 실패합니다.

HomeID와 Datetime이 동일한 2 개의 행이있는 경우 쿼리는 아래와 같이 쿼리에 고유성을 추가하기 위해 필요에 따라 고유 한 HomeID가 아닌 두 행을 모두 반환합니다.

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

결과 표시- "# 1054- '필드 목록'의 알 수없는 열 'tt.MaxDateTime'"
Istiaque Ahmed

@IstiaqueAhmed 당신은 MaxDatetime을 제출 했습니까?
Manoj Kargeti

아니요, OP의 테이블에는 그러한 열이 없습니다.
Istiaque Ahmed

오류도 같은 말을 .. 정확히 무엇을하고 싶어? 테이블 구조와 쿼리를 보낼 수 있습니까?
Manoj Kargeti

1

아래 쿼리에서 원하는 결과를 얻습니다.

Select id, home,datetime,player,resource, row_number() over (Partition by home ORDER by datetime desc) as rownum from tablename where rownum=1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.