我有一张球员表现表:
CREATE TABLE TopTen (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
home INT UNSIGNED NOT NULL,
`datetime`DATETIME NOT NULL,
player VARCHAR(6) NOT NULL,
resource INT NOT NULL
);
什么查询将返回每个不同的行 home
保持最大值 datetime
?换句话说,我如何按最大 datetime
进行过滤(按 home
分组)并在结果中仍然包含其他非分组、非聚合列(例如 player
)?
对于此示例数据:
INSERT INTO TopTen
(id, home, `datetime`, player, resource)
VALUES
(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
:
-- 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
的一些重复项.
然后我尝试加入一个获得最大值 datetime
的子查询。每行 id
:
-- 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`
不。给出所有记录。
我尝试了各种奇异的查询,每个查询都有不同的结果,但没有任何结果能让我更接近解决这个问题。
最佳答案
你离得太近了!您需要做的就是选择家庭及其最大日期时间,然后在两个字段上连接回 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
关于mysql - 如何在 MYSQL 中通过另一列选择具有 MAX(列值)、PARTITION 的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40720833/