SQL에서 MAX(열 값), 다른 열로 구분하여 행을 SELECT하려면 어떻게 해야 하나요?

**내 테이블은 다음과 같습니다.

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

최대 값인 datetime을 갖는 각각의 고유 home을 선택해야 합니다.

**결과는 다음과 같습니다.

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 

Nope. 모든 레코드를 제공합니다.

-- 3 ..something exotic: 

다양한 결과를 제공합니다.

해결책

거의 다 됐어요! 집과 최대 날짜 시간을 모두 선택한 다음 두 필드의 topten 테이블에 다시 조인하기만 하면 됩니다:

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
해설 (22)

자, 갑니다 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 의 계수 () 함수를 통해 죄송합니다. 없습니다. 에뮬레이션된 볼 수 있지만, [분석 (lc-fc 순위) 기능을 에뮬레이트하는 MySQL 과] [1]. 따라서 이것은 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

[1]: 페이지 (http://www.oreillynet.com/pub/a/mysql/2007/03/29/emulating-analytic-aka-ranking-functions-with-mysql.html) = 3

해설 (4)

가장 빠른 ',' 없이 ':' 그룹순 않고 내부 쿼리에는 솔루션이므로 MySQL

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' 이 있는 테이블을 사용하여 자신을 많이 얻어맞았다. '표' 에서 '모든 행 사용을 통해 나타나는 결과 왼쪽 참가하십시오 어딜가던지 설정되었습니다. # 39 표, 그 don& 경기를 할 수 없다 '는' b '를 NULL 열을' b '.

다른 조건이 '' 에서 'b' 를 묻는 참가하십시오 일치시키려면 행만 있는 가치에 대해 '에서' 열 (row) 보다 더 큰 datetime 어딜가던지 '.

이 질문에 '이' 가 실린 데이터를 사용하여 왼쪽 참가하십시오 깔의 페어:

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

마지막으로, 여기서 '만' 는 조항이 있는 페어 '의' b '의 열의 nulll (이들은' *' 표시된 위 표에); 즉, 두 번째 찼음을 인해 '에서' 행 '는 조항을 참가하십시오) 에서 선택한 가장 큰 값을 어딜가던지 열' datetime '.

읽은 SQL 안티패턴: 특히 피하고 데이터베이스 프로그래밍 책을 다른 SQL 팁.

해설 (7)

각 '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
해설 (8)

이렇게 하면 원하는 결과를 얻을 수 있을 것 같습니다:

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

하지만 다른 열도 필요한 경우 원래 테이블과 조인을 수행하면 됩니다(Michael La Voie 답변 확인).

안부 전해주세요.

해설 (3)

이 사람들 때문에 것 (주석문입니다 날짜 범위는 1.5 년) 에 극대화됩니다 스레드할 isn& # 39 이 정도 간단해진다는, t:

  • 선택 (SELECT * ORDER BY topten 에서 datetime DESC) 에서 'home' 그룹순 tmp

아니 집선의 필요한 기능을.

건배해요

해설 (5)

이 번호요 시도하시겠습니까 쿼리하지 성능은 더 큰 테이블을 위해, 그리고 수도 있습니다. 각 가정과 그 때 두 개 이상의 레코드전자문서의 작동하잖아 없는 날짜가 다르다. 마이클 La 보리 질의입니다 나으뇨 일반 MySQL 에서 1 위.

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

또는) 의 경우, 또는 해당 db 분석 기능을 제공하는 시도하시겠습니까 postgres

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
해설 (3)

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)

이 시도하시겠습니까 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
해설 (0)
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
해설 (0)

또 다른 방법은 기본적으로 각 그룹의 하위 순위 중 가장 최근의 행일 gt 쿼리하지 사용하여 각 행에 대한 가장 최근의 행뿐만 계산합니다 그룹당 필터링합니다 마찬가지로 다음 순위 = 1

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

[데모] [1]

다음은 각 행에 대해 더 잘 이해할 수 없는 [인텔®visual 데모] [2] 의 랭크

&gt. 만약에 글을 읽어 볼 수 있는 # 39, & # 39 같은 두 가지 행뿐만 home&. # 39, & # 39 와 datetime&. 필드 값을 가능

위의 두 개 이상의 행을 반환되므로 쿼리하지 실패하고 세 것이다. 이 문제를 덮기 위해 할 수 있을 것으로 다른 기준을 결정할 수 있는 폭포 위 수행됨을 행의 / 매개변수입니다 / 열 것이다. 샘플 데이터 세트를 보면서 내가 있어야 할 기본 키 열 'id' 는 solaris. 잡깐 자동으로 설정되었습니다 증분식. 그래서 우리는 이 열을 사용할 수 있는 가장 최근의 행일 면변형을 의해 '사례' 를 통해 동일한 쿼리하지 강조표시할 같은 기술서임을

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

[데모] [3]

이 가운데 가장 높은 id 'datetime 값과 같은 행일 쿼리하지 그들위에 탄력을 받게 됐다

[인텔®visual 데모] [4] 에 랭크 각 행에 대한 없습니다.

[1]: 9/37a0d/16 http://sqlfiddle.com/ #! [2]: 9/37a0d/17 http://sqlfiddle.com/ #! [3]: 9/d2f025/2 http://sqlfiddle.com/ #! [4]: 9/d2f025/3 http://sqlfiddle.com/ #!

해설 (0)
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)
해설 (0)

이것은 MySQL 버전 (datetime) 에 있는 경우 최대 하나의 엔트리만을 인쇄하는 중복 sim-id?

여기가 시험을 2/0a4ae/1 수 있습니다 http://www.sqlfiddle.com/ #!

# 샘플 데이터

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)

수락됨 Answers& # 39. # 우투

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)
해설 (2)

왜안돼요 사용: 홈, 최대 (datetime) 를 선택, 플레이어 리소스에는 마스다테타임 충스러웠으니 topten 그룹순 홈 Did I miss 뭔가?

해설 (4)

이 시도하시겠습니까

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

해설 (3)

이것은 쿼리하지 합니다.

 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;
해설 (1)

그러나 실패할 경우 대부분의 경우 이 수락됨 answer will apc® @michae 벌금 1 을 같습니다.

이 경우 2 명이 모두 같은 쿼리가 있다면 행뿐만 반환되므로 아니라 필요에 따라 서로 다른 호메이드 호메이드 및 Datetime 행뿐만 있는 서로 다른 추가 질의 아래와 같이.

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
해설 (4)