MySQL在两列中选择唯一的行,其中一列中的值最高

时间:2015-11-25 15:24:45

标签: mysql greatest-n-per-group

我有一张基本表:

+-----+--------+------+------+
| id, | name,  | cat, | time |
+-----+--------+------+------+
|   1 | jamie  |    1 |  100 |
|   2 | jamie  |    2 |  100 |
|   3 | jamie  |    1 |   50 |
|   4 | jamie  |    2 |  150 |
|   5 | bob    |    1 |  100 |
|   6 | tim    |    1 |  300 |
|   7 | alice  |    4 |  100 |
+-----+--------+------+------+

我尝试使用“左加入自我,调整连接条件和过滤器”这个答案的一部分:SQL Select only rows with Max Value on a Column但是有些原因当有值为0的记录中断时,它也没有因某种原因返回每个独特的答案。

在对此表进行查询时,我希望收到以下值:

+-----+--------+------+------+
| id, | name,  | cat, | time |
+-----+--------+------+------+
|   1 | jamie  |    1 |  100 |
|   4 | jamie  |    2 |  150 |
|   5 | bob    |    1 |  100 |
|   6 | tim    |    1 |  300 |
|   7 | alice  |    4 |  100 |
+-----+--------+------+------+

因为它们在名称和猫身上都是独一无二的,并且具有最高的时间价值。

我从上面的答案改编的查询是:

SELECT a.name, a.cat, a.id, a.time
FROM data A
INNER JOIN (
    SELECT name, cat, id, MAX(time) as time
    FROM data
    WHERE extra_column = 1
    GROUP BY name, cat
) b ON a.id = b.id AND a.time = b.time

3 个答案:

答案 0 :(得分:3)

这里的问题是,每行ID是唯一的,在获得最大值时您无法获得唯一值;你必须加入分组值。

SELECT a.name, a.cat, a.id, a.time
FROM data A
INNER JOIN (
    SELECT name, cat, MAX(time) as time
    FROM data
    WHERE extra_column = 1
    GROUP BY name, cat
) b ON A.Cat = B.cat and A.Name = B.Name AND a.time = b.time

考虑一下......那么从Inline视图返回的mySQL是什么ID?对于jamie来说可能是1或3和2或4。如何引擎知道选择具有最大ID的引擎?它可以自由选择每个组中的任何值,因此除非它们相同,否则所选择的值是不确定的。 "它可能选错了导致错误的结果。所以你不能用它来加入。

https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html

答案 1 :(得分:2)

如果您想使用自我加入,可以使用此查询:

SELECT
  d1.*
FROM
  date d1 LEFT JOIN date d2
  ON d1.name=d2.name
     AND d1.cat=d2.cat
     AND d1.time<d2.time
WHERE
  d2.time IS NULL

答案 2 :(得分:0)

这很简单

for row in new_generation: try: del row[4] except: return new_generation return new_generation 中按猫分组选择MAX(TIME),名称,猫